2013-06-24 4 views
8

Ich benutze Python und Matplotlib, um mehrere geschlossene Polygone zu erstellen. Ich muss sie dann mit einer Schraffur füllen, was über set_hatch erledigt werden kann.Wie fülle ich ein Polygon mit einer benutzerdefinierten Schraffur in Matplotlib?

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

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

Leider mit Graustufenbildern arbeite ich, und ich brauche mehr Luken als standardmäßig verfügbar - ich würde eine Bitmap schaffen bevorzugen (oder etwas ähnliches Bild), die statt mit Ziegeln gedeckt werden könnte Verwenden dieser Luken mit unterschiedlichen Dichten.

Ich bin offen für andere Python-Bibliotheken (Pyglet, Pygame, PIL, etc), aber ich würde die Lösung in Python bevorzugen.

+0

Es ist ein Beispiel für [custom Luken] (http://stackoverflow.com/questions/4745937/how-to-decrease- Luke-Dichte-in-Matplotlib? Rq = 1) hier, aber der Autor sagt, es ist spröde. – cphlewis

+1

Der Standard set_hatch hat acht verschiedene Luken, von denen jede in mindestens zwei Dichten arbeiten kann und die kombiniert werden können. Ich würde denken, eine Verschwörung wäre zu verwirrend, lange bevor Ihnen Kombinationen von Luken ausgehen würden. Haben Sie ein Beispiel für Graustufen-Schraffuren mit Dutzenden von nutzbaren Füllungen? – cphlewis

Antwort

6

Sie können die Unterklasse matplotlib.hatch.Shapes erstellen und eine benutzerdefinierte Schraffur basierend auf einem beliebigen Referenzpfad innerhalb des Einheitsquadrats [[-0.5, 0.5] x [-0.5, 0.5]] definieren.

Vorläufig:

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() 

Giving:

enter image description here