2013-06-24 14 views
8

Sto usando python e matplotlib per creare diversi poligoni chiusi. Ho quindi bisogno di riempirli con un portello, che può essere fatto attraverso set_hatch.Come riempire un poligono con un tratteggio personalizzato in matplotlib?

http://matplotlib.org/api/artist_api.html#matplotlib.patches.Patch.set_hatch

http://matplotlib.org/examples/pylab_examples/hatch_demo.html

Purtroppo sto lavorando con le immagini in scala di grigi, e ho bisogno di più portelli di quelli forniti per default - io preferirei di fornire una bitmap (o qualche immagine simile) che può essere piastrellato posto di usare questi portelli con densità variabili.

Sono aperto ad altre librerie python (pyglet, pygame, PIL, ecc.) Tuttavia preferirei che la soluzione fosse in python.

+0

C'è un esempio di [tratteggi personalizzati] (http://stackoverflow.com/questions/4745937/how-to-decrease- hatch-density-in-matplotlib? rq = 1) qui, ma l'autore dice che è fragile. – cphlewis

+1

Il set_hatch standard ha otto boccaporti distinti, ognuno dei quali può operare in almeno due densità e che possono essere combinati. Penserei che una trama sarebbe troppo confusa molto tempo prima che finissi le combinazioni di boccaporti. Hai un esempio di tratteggio in scala di grigi con dozzine di riempimenti utilizzabili? – cphlewis

risposta

6

È possibile creare sottoclasse matplotlib.hatch.Shapes e definire un tratteggio personalizzato basato su qualsiasi percorso di riferimento tracciato all'interno del quadrato unitario [[-0.5, 0.5] x [-0.5, 0.5]].

Provvisorio:

import numpy as np 
import matplotlib.hatch 
import matplotlib.pyplot as plt 
from matplotlib.patches import Ellipse, Polygon 


house_path = Polygon(
    [[-0.3, -0.4], [0.3, -0.4], [0.3, 0.1], [0., 0.4], [-0.3, 0.1]], 
    closed=True, fill=False).get_path() 

class CustomHatch(matplotlib.hatch.Shapes): 
    """ 
    Custom hatches defined by a path drawn inside [-0.5, 0.5] square. 
    Identifier 'c'. 
    """ 
    filled = True 
    size = 1.0 
    path = house_path 

    def __init__(self, hatch, density): 
     self.num_rows = (hatch.count('c')) * density 
     self.shape_vertices = self.path.vertices 
     self.shape_codes = self.path.codes 
     matplotlib.hatch.Shapes.__init__(self, hatch, density) 

matplotlib.hatch._hatch_types.append(CustomHatch) 

fig = plt.figure() 
ax = fig.add_subplot(111) 

ellipse = ax.add_patch(Ellipse((0.5, 0.5), 0.3, 0.5, fill=False)) 
ellipse.set_hatch('c') 
ellipse.set_color('red') 
plt.show() 

Dare:

enter image description here

Problemi correlati