2011-01-20 16 views
8

Ho bisogno di diminuire la densità del portellone in una barra realizzata con matplotlib. Il modo in cui aggiungo i boccaporti:Come diminuire la densità del tratteggio in matplotlib

kwargs = {'hatch':'|'} 
rects2 = ax.bar(theta, day7, width,fill=False, align='edge', alpha=1, **kwargs) 

kwargs = {'hatch':'-'} 
rects1 = ax.bar(theta, day1, width,fill=False, align='edge', alpha=1, **kwargs) 

So che è possibile aumentare la densità con l'aggiunta di più caratteri al modello, ma come si può diminuire la densità ?!

+0

È possibile aggiungere spazi bianchi al tratteggio? – TryPyPy

risposta

8

Questo è un trucco completo, ma dovrebbe funzionare per il tuo scenario.

Fondamentalmente, è possibile definire un nuovo modello di tratteggio che diventi meno denso più lunga è la stringa di input. Sono andato avanti e adattato il modello HorizontalHatch per voi (si noti l'utilizzo del carattere di sottolineatura):

class CustomHorizontalHatch(matplotlib.hatch.HorizontalHatch): 
    def __init__(self, hatch, density): 
     char_count = hatch.count('_') 
     if char_count > 0: 
      self.num_lines = int((1.0/char_count) * density) 
     else: 
      self.num_lines = 0 
     self.num_vertices = self.num_lines * 2 

Devi quindi aggiungerlo alla lista dei modelli di tratteggio disponibili:

matplotlib.hatch._hatch_types.append(CustomHorizontalHatch) 

nel codice tracciato è ora possibile utilizzare il modello definito:

kwargs = {'hatch':'_'} # same as '-' 
rects2 = ax.bar(theta, day7, width,fill=False, align='edge', alpha=1, **kwargs) 

kwargs = {'hatch':'__'} # less dense version 
rects1 = ax.bar(theta, day1, width,fill=False, align='edge', alpha=1, **kwargs) 

Tenete a mente che questa non è una soluzione molto elegante e potrebbe rompere in qualsiasi momento nelle versioni future. Anche il mio codice di pattern è solo un attacco rapido e potresti voler migliorare. Io eredito da HorizontalHatch ma per maggiore flessibilità lo svilupperesti su HatchPatternBase.

Problemi correlati