2015-11-03 59 views
1

這與設置mincnt=1不一樣。當單元格的平均值爲零時是否可以移除彩色垃圾箱?請參閱下面的代碼示例。我想要點1不要畫。設置mincnt=1將消除在細胞出現一次,有個意思> = 0Matplotlib hexbin:如何避免在np.mean爲零時顯示垃圾箱

d1 = {'Size': {0: 0, 1: 0,2: 0, 3: 5, 4: 3, 5: 3, 6: 8, 7: 5, 8: 9, 9: 3, 10: 6, 11: 7, 12: 5, 13: 6, 14: 5, 15: 5, 16: 7, 17: 6, 18: 0}, 
     'X': {0: -0.86602540400000005, 1: 0.86602540400000005, 2: 0.0, 3: -0.34641016200000002, 4: -0.28867513500000003, 5: 0.0, 6: 0.10825317499999999, 7: 0.34641016200000002, 8: 0.0, 9: -0.86602540400000005, 10: -0.43301270200000003, 11: 0.0, 12: -0.17320508100000001, 13: 0.43301270200000003, 14: 0.34641016200000002, 15: 0.34641016200000002, 16: 0.0, 17: 0.0, 18: 0.0}, 
     'Y': {0: -0.5, 1: -0.5, 2: 1.0, 3: 0.40000000000000002, 4: -0.5, 5: 1.0, 6: 0.0625, 7: 0.40000000000000002, 8: 0.0, 9: -0.5, 10: 0.25, 11: 0.14285714300000002, 12: -0.5, 13: 0.25, 14: 0.40000000000000002, 15: 0.40000000000000002, 16: 0.14285714300000002, 17: -0.5, 18: 0.0}} 

test1 = pd.DataFrame(d1) 
import numpy as np 
plot_format = { 
    "gridsize":15, 
    "cmap":plt.cm.YlOrRd, 
    #"mincnt":1, 
    "vmin":1, 
    "vmax":9,   
    "reduce_C_function":np.mean 
} 

ax = plt.subplot(111) 
ax.hexbin(test1["X"], test1["Y"], C=test1.Size, **plot_format) 
ax.axis([-1, 1, -0.8, 1.2]) 
plt.show() 

回答

1

你可以使用由hexbin返回的matplotlib.collections.PolyCollection對象的.get_array()方法每個箱計數,然後用它來設置alpha通道顏色的補丁:

hb = ax.hexbin(test1["X"], test1["Y"], C=test1.Size, **plot_format) 

# you might need to force a draw event here, otherwise `hb.get_colors()` can return 
# incorrect values 
ax.figure.canvas.draw() 

counts = hb.get_array()   # get the counts (n,) 
colors = hb.get_facecolors() # get the facecolors of the patches (n, 4) 
colors[:, 3] = counts > 0  # set the alpha channel to 0 where counts <= 0 
hb.set_facecolors(colors)  # update the facecolors of the patches 
+0

聰明!然而,當我嘗試它時,'colors'似乎已經變成了'(1,4)'而不是'(n,4)'。漁獲在哪裏? –

+0

您可能需要在繪製hexbins和調用'get_colors'之間強制繪製事件,例如通過調用'ax.figure.canvas.draw()'或'plt.draw()' –

+0

Niiice!像微風一樣工作!謝謝! –