2015-04-09 13 views
12

C'è un modo per aumentare la larghezza del tratteggio in matplotlib?Come modificare l'ampiezza di riga del tratteggio in matplotlib?

Ad esempio, il codice seguente, specificando linewidth, modifica solo la larghezza del bordo. Voglio cambiare la larghezza di riga della linea utilizzata per il tratteggio.

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

[Questa risposta] (http://stackoverflow.com/a/6552115/4403123) potrebbe essere d'aiuto. Vedrò se riesco a capirlo e scrivere una risposta per quello che stai facendo. – KSFT

+0

Nei commenti [qui] (http://stackoverflow.com/questions/14325773/how-to-change-marker-border-width-and-hatch-width?rq=1) @tcaswell dice che sarebbe molto difficile da regolare le larghezze delle linee di tratteggio. – cphlewis

+0

Vedo che è complicato ... Grazie per i commenti. – monodera

risposta

4

Se si utilizza il pdf e si dispone dei diritti di sudo, è possibile modificarlo in backend_pdf.py. C'è una linea

self.output(0.1, Op.setlinewidth) 

Di solito si trova in /usr/lib/pymodules/python2.7/matplotlib/backends/backend_pdf.py.

Anche qualcuno ha scritto un trucco per farlo dal tuo script (ancora bisogno di diritti sudo da eseguire). Soluzione da qui: 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

Ho usato il tuo primo suggerimento per modificare temporaneamente la riga in 'backend_pdf.py'. Questo è un bel work-around fino a quando un'opzione diventa disponibile per modificarlo con un argomento di parole chiave. –

2

C'è una soluzione che è molto hacky, ma si permette di fare ciò che si vuole, senza modificare i file interni matplotlib: è possibile scimmia rattoppare le writeHatches di PdfFile in questo modo:


# 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 

È quindi possibile fare

setCustomWidth(2) 

prima di salvare a capire come pdf.

1

Ho una soluzione che può aiutare alcuni. Lo uso quando realizzo i miei grafici finali per i rapporti. La larghezza del portellone è influenzato dall'impostazione dpi in

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

la figura seguente viene effettuata a 80 DPI enter image description here

Poi enter image description here di nuovo a 400 DPI

Capisco perfettamente che puo introdurre altre questioni, ma ho pensato che valesse la menzione.

8

Come di matplotlib versione 2.0, è possibile directly change the linewidth parameter, come segue:

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

Questa sembra una soluzione migliore di quello che la gente ha in precedenza. È possibile controllare la versione matplotlib da:

import matplotlib as mpl 
print(mpl.__version__) # should be 2.x.y 
Problemi correlati