簡體   English   中英

使用自定義cmap的matplotlib散點圖-顏色不正確

[英]matplotlib scatter plot with custom cmap - colors not right

因此,我遵循一種模式為散點圖創建自定義顏色圖和cbar。 我正在創建4個子圖,每個子圖覆蓋用於賦予點顏色的參數的不同范圍。 該參數的取值范圍是1e-10到1.0。

我執行以下操作:

cmap = plt.cm.jet
# extract all colors from the .jet map
cmaplist = [cmap(i) for i in range(cmap.N)]
# force the first color entry to be grey
cmaplist[0] = (.5,.5,.5,1.0)
# create the new map
cmap = cmap.from_list('Custom cmap', cmaplist, cmap.N)

# define the bins and normalize
bounds = np.linspace(-10,0,11)
norm   = mpl.colors.BoundaryNorm(bounds, cmap.N)
...
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, sharex='col', sharey='row', figsize=(20,20))
...
ax1.scatter(xcoord[rng1], ycoord[rng1], s=massFilt[rng1]/dotNorm,
                    c=np.ma.log10(Zfilt[rng1]), cmap=cmap)
ax2.scatter(xcoord[rng2],ycoord[rng2], s=massFilt[rng2]/dotNorm,
                    c=np.ma.log10(Zfilt[rng2]), cmap=cmap)
ax3.scatter(xcoord[rng3], ycoord[rng3], s=massFilt[rng3]/dotNorm,
                    c=np.ma.log10(Zfilt[rng3]), cmap=cmap)
ax4.scatter(xcoord[rng4], ycoord[rng4], s=massFilt[rng4]/dotNorm,
                    c=np.ma.log10(Zfilt[rng4]), cmap=cmap)

其中rng被定義為

rng1 = (Zfilt < 2.e-7)
rng2 = ((Zfilt >= 2.e-7) & (Zfilt < 1.e-4))
rng3 = ((Zfilt >= 1.e-4) & (Zfilt < 1.e-2))
rng4 = (Zfilt >= 1.e-2)

因此,第一個面板僅包括小於2e-7的那些點,並且所有點均正確着色...我已經驗證了過濾器是否正常工作:例如Zfilt [rng4]僅包含Zfilt> 1e-2的點。 但是,我以某種方式在rng2和rng3中看到只能用於rng1的顏色 見附件。

有任何想法嗎? 我究竟做錯了什么?

面板2(右上方)中的所有點都小於1e-4,應為綠色,藍色或灰色...不是紅色?

這是Zfilt [rng2]的示例-

Z values rng2  [-4.23451696 -4.35974369 -5.18479833 -6.17304647 -4.48839191 -5.16774006
 -4.12047222 -6.11491263 -5.81392662 -4.6491248  -4.75038775 -5.06640103
 -4.20821705 -4.12556725 -4.58661378 -4.17023495 -5.40845781 -4.54981553
 -5.82830048 -4.11185471 -4.43155534 -6.17025186 -4.88154584 -5.00024704
 -4.13626926 -5.57797731 -6.0617742  -5.33182163 -5.44963247 -5.88409509
 -6.16903327 -5.70808154 -4.88578943 -4.00873256 -4.1457824  -4.45174817
 -5.43829583 -4.32470978 -4.11634754 -5.1141915  -5.13310282 -4.15469421
...

scatter()並不了解數據的假定范圍,因此它將顏色映射應用於所看到的整個范圍,即從所提供數組的最小值到最大值。 由於您想要不同的行為(所有子圖的范圍都相同,而不管數據如何),因此需要通過vminvmax參數顯式指定范圍:

ax1.scatter(xcoord[rng1], ycoord[rng1], s=massFilt[rng1]/dotNorm,
                c=np.ma.log10(Zfilt[rng1]), cmap=cmap,
                vmin=-10, vmax=0)
ax2.scatter(xcoord[rng2],ycoord[rng2], s=massFilt[rng2]/dotNorm,
                c=np.ma.log10(Zfilt[rng2]), cmap=cmap,
                vmin=-10, vmax=0)
# etc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM