2015-04-09 16 views
12

Czy istnieje sposób na zwiększenie szerokości kreskowania w matplotlib?Jak zmienić szerokość linii kreskowania w matplotlib?

Na przykład następujący kod podając linewidth zmienia tylko szerokość krawędzi. Chcę zmienić szerokość linii linii użytej do kreskowania.

import matplotlib.pyplot as plt 
import numpy as np 

x = np.random.randn(100) 

fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.hist(x, fill=False, hatch='/', linewidth=2) 

plt.show() 
+0

[Ta odpowiedź] (http://stackoverflow.com/a/6552115/4403123) może pomóc. Zobaczę, czy mogę to zrozumieć i napisać odpowiedź na to, co robisz. – KSFT

+0

W komentarzach [tutaj] (http://stackoverflow.com/questions/14325773/how-to-change-marker-border-width-and-hatch-width?rq=1) @tcaswell mówi, że byłoby bardzo trudne do ustawienia szerokości linii kreskowania. – cphlewis

+0

Widzę, że to skomplikowane ... Dzięki za komentarze. – monodera

Odpowiedz

4

Jeśli używasz pdf i masz uprawnienia sudo, możesz to zmienić w backend_pdf.py. Jest to linia

self.output(0.1, Op.setlinewidth) 

Zwykle znajduje się w /usr/lib/pymodules/python2.7/matplotlib/backends/backend_pdf.py.

Również ktoś napisał hack do zrobienia tego ze swojego skryptu (nadal potrzebne są uprawnienia sudo do wykonania). Rozwiązanie stąd: http://micol.tistory.com/358

import os 
import re 
import matplotlib 

def setHatchThickness(value): 
libpath = matplotlib.__path__[0] 
backend_pdf = libpath + "/backends/backend_pdf.py" 
with open(backend_pdf, "r") as r: 
    code = r.read() 
    code = re.sub(r'self\.output\((\d+\.\d+|\d+)\,\ Op\.setlinewidth\)', 
        "self.output(%s, Op.setlinewidth)" % str(value), code) 
    with open('/tmp/hatch.tmp', "w") as w: 
     w.write(code) 
    print backend_pdf 
    os.system('sudo mv /tmp/hatch.tmp %s' % backend_pdf) 


setHatchThickness(1.0) 
+0

Użyłem twojej pierwszej sugestii, aby tymczasowo zmodyfikować linię w 'backend_pdf.py'. Jest to dobre rozwiązanie, dopóki nie zostanie udostępniona opcja modyfikacji za pomocą argumentu ze słowem kluczowym. –

2

Jest to rozwiązanie, które jest bardzo hacky, ale pozwala robić to, co chcesz, bez zmiany matplotlib pliki wewnętrzne: można małpa krosuj writeHatches z PdfFile tak:


# make sure you have the correct imports, 
# they may differ depending on the matplotlib version 
import matplotlib.backends.backend_pdf 
from matplotlib.externals import six 
from matplotlib.backends.backend_pdf import Name, Op 
from matplotlib.transforms import Affine2D 

def setCustomHatchWidth(customWidth): 

    def _writeHatches(self): 
     COPY CODE FROM matplotlib.__path__[0] + "/backends/backend_pdf.py" HERE 
     change the line 
      self.output(0.1, Op.setlinewidth) 
     to 
      self.output(customWidth, Op.setlinewidth) 

    matplotlib.backends.backend_pdf.PdfFile.writeHatches = _writeHatches 

można wtedy zrobić

setCustomWidth(2) 

przed zapisaniem dowiedzieć jako pdf.

1

Mam obejście, które może pomóc niektórym. Używam tego przy tworzeniu moich końcowych wątków dla raportów. Szerokość klapy wpływa ustawienie DPI w

plt.savefig('pic',dpi=300) 

Poniższy rysunek jest wykonywana przy 80 DPI enter image description here

Następnie enter image description here ponownie przy 400 DPI

pełni rozumiem, że może to wprowadzić inne kwestie, ale pomyślałem, że warto o tym wspomnieć.

8

Od matplotlib wersji 2.0, można directly change the linewidth parameter, to w następujący sposób:

import matplotlib as mpl 
mpl.rcParams['hatch.linewidth'] = 0.1 # previous pdf hatch linewidth 
mpl.rcParams['hatch.linewidth'] = 1.0 # previous svg hatch linewidth 

Wydaje lepsze obejścia niż to, co ludzie mają powyżej. Możesz sprawdzić wersję matplotlib przez:

import matplotlib as mpl 
print(mpl.__version__) # should be 2.x.y 
Powiązane problemy