2014-09-05 30 views
6

我剛剛發現了一個創建Matplotlib填充等高線圖的截圖,該截圖被修剪爲任意多邊形區域。該方法需要在由Matplotlib的contourf()函數返回的QuadContourSet中的每個PathCollection實例上調用set_clip_path(patch)。 MWE:Matplotlib set_clip_path要求修補程序被繪製

import matplotlib.pyplot as plt 
import numpy as np 
import matplotlib.patches as mpatches 
import matplotlib.path as mpath 

# some arbitrary data to plot 
xx, yy = np.meshgrid(np.linspace(-5, 5, 20), np.linspace(-10, 10, 20), copy=False) 
zz = np.sqrt(xx ** 2 + yy ** 2) 

poly_verts = [ 
    (0, 0), 
    (-4, 7), 
    (-4, -7), 
    (4, -7), 
    (4, 7), 
    (0, 0) 
] 
poly_codes = [mpath.Path.MOVETO] + (len(poly_verts) - 2) * [mpath.Path.LINETO] + 
mpath.Path.CLOSEPOLY] 

# create a Path from the polygon vertices 
path = mpath.Path(poly_verts, poly_codes) 

# create a Patch from the path 
patch = mpatches.PathPatch(path, facecolor='none', edgecolor='k') 

plt.figure() 
ax = plt.gca() 
cont = plt.contourf(xx, yy, zz, 50) 

# add the patch to the axes 
ax.add_patch(patch) ## TRY COMMENTING THIS OUT 
for col in cont.collections: 
    col.set_clip_path(patch) 

plt.show() 

Resulting plot

我感到困惑的一個方面:如果我註釋掉了標繪的補丁,那麼沒有剪裁作品的線,我結束了一個空白的情節。我認爲,在PathCollection上使用補丁調用set_clip_path方法時,補丁必須添加到軸上,但我不明白爲什麼。創建修補程序設置edgecolor='none'是一個很好的解決方法,但哪裏有趣呢?

有什麼想法?

+1

我懷疑這與在顯示空間中完成的剪切有關,除非繪製了補丁,否則它只有數據空間座標。 – tacaswell 2014-09-05 23:48:33

+0

我花了一段時間才弄清楚爲什麼我有一個空白的情節,而且你所描述的cuprit事實上是我需要在所有其他事情出現之前繪製想象中的無色補丁。非常意外的行爲。 – Brian 2017-03-18 19:08:19

回答

1

如果該補丁沒有添加到軸上,無法根據應該處理的變換來知道。通過將它添加到座標軸中,您可以隱式設置變換爲它所添加軸的數據變換。
我想這個必要性會變得很清晰,如果你想象一個圖上有幾個軸。然後mpatches.PathPatch可能會被用於任何這些軸。

您可能確實是由face-和edgecolor設置爲"none"

patch = mpatches.PathPatch(path, facecolor='none', edgecolor='none') 

,或者將其無形產品總數設置補丁無形,

patch = mpatches.PathPatch(path, visible=False) 

如果你真的想擺脫加入您可以手動設置所需的轉換

patch = mpatches.PathPatch(path, transform=ax.transData) 

for col in cont.collections: 
    col.set_clip_path(patch) 

在這種情況下,不需要將其添加到軸。

相關問題