2011-01-27 26 views
7

Şu anda Python ve matplotlib ile bir şey uyguluyorum. Çokgenler nasıl çizileceğini ve bunları nasıl dolduracağımı biliyorum, ancak'u çokgenin içine nasıl doldurabilirim? Daha açık olmak gerekirse, axhspan 've axvspan' lar kullanılarak elde edilen sonucu, kırmızı ve dikdörtgensel kırmızı çizgileri keserek yatay ve dikey kırmızı çizgileri keserek değiştirmek istiyorum (bunun dışında her şey taranır). : enter image description hereMatplotlib ile alanların doldurulması tamamlandı

cevap

4

This post esasen bu soruyu sorar (ve cevaplar). Kabul edilen cevapta 'Düzenle 2'ye bakın. Çizim poligonunun büyüklüğünü bir vektör poligonunun nasıl oluşturulacağını ve sonra tamamlamayı istediğiniz şekle uyacak şekilde nasıl bir delik oluşturulacağını anlatır. Bu, kalem hareket ettiğinde çizilip çizilmeyeceğini tanımlayan satır kodları atayarak yapar.

import numpy as np 
import matplotlib.pyplot as plt 

def main(): 
    # Contour some regular (fake) data 
    grid = np.arange(100).reshape((10,10)) 
    plt.contourf(grid) 

    # Verticies of the clipping polygon in counter-clockwise order 
    # (A triange, in this case) 
    poly_verts = [(2, 2), (5, 2.5), (6, 8), (2, 2)] 

    mask_outside_polygon(poly_verts) 

    plt.show() 

def mask_outside_polygon(poly_verts, ax=None): 
    """ 
    Plots a mask on the specified axis ("ax", defaults to plt.gca()) such that 
    all areas outside of the polygon specified by "poly_verts" are masked. 

    "poly_verts" must be a list of tuples of the verticies in the polygon in 
    counter-clockwise order. 

    Returns the matplotlib.patches.PathPatch instance plotted on the figure. 
    """ 
    import matplotlib.patches as mpatches 
    import matplotlib.path as mpath 

    if ax is None: 
     ax = plt.gca() 

    # Get current plot limits 
    xlim = ax.get_xlim() 
    ylim = ax.get_ylim() 

    # Verticies of the plot boundaries in clockwise order 
    bound_verts = [(xlim[0], ylim[0]), (xlim[0], ylim[1]), 
        (xlim[1], ylim[1]), (xlim[1], ylim[0]), 
        (xlim[0], ylim[0])] 

    # A series of codes (1 and 2) to tell matplotlib whether to draw a line or 
    # move the "pen" (So that there's no connecting line) 
    bound_codes = [mpath.Path.MOVETO] + (len(bound_verts) - 1) * [mpath.Path.LINETO] 
    poly_codes = [mpath.Path.MOVETO] + (len(poly_verts) - 1) * [mpath.Path.LINETO] 

    # Plot the masking patch 
    path = mpath.Path(bound_verts + poly_verts, bound_codes + poly_codes) 
    patch = mpatches.PathPatch(path, facecolor='white', edgecolor='none') 
    patch = ax.add_patch(patch) 

    # Reset the plot limits to their original extents 
    ax.set_xlim(xlim) 
    ax.set_ylim(ylim) 

    return patch 

if __name__ == '__main__': 
    main() 
+0

sen başvurmak sonrası 2D piksel görüntü maskeleme hakkındadır: Burada

bu soruya alakalı yukarıda atıfta bulunulan yazının kısmıdır. Bu, soruna yaklaşık bir çözüm olsa da, ideal çözüm vektör çizim (piksel çizimi değil) yoluyla olur. – EOL

+0

kabul edilen yanıtın 'Edid 2' bölümüne aşağı inin, bir vektör çözümü bulacaksınız. – Paul

+0

Teşekkürler bpowah! Gerçekten de, 'Edit 2' içinde 'mask_outside_polygon' işlevi, bazı kuluçkalarla birlikte hile yaptı. –

1

Sadece bir dikdörtgenin tamamlayıcısına ihtiyacınız varsa, bunun yerine 4 dikdörtgen çizebilirsiniz (örnek resminizde görülebilen 4 dikdörtgen gibi). Arsa kenarlarının koordinatları, xlim() ve ylim() ile elde edilebilir. Ben Matplotlib bir poligonun dışında çizer gibi sunar emin değilim

...