2017-12-03 1153 views
-1

我想從某些數據文件中製作等高線圖。我遇到的麻煩是我想要顏色欄上的最小值以下的z值與最小值的顏色相同。 當使用例如線性比例尺時,這很容易。 contourfextend="both"選項,或者使用cmap.set_under()作爲顏色映射。不幸的是,在使用logscale時,這些選項都不起作用。任何人都可以提出一個解決方法?我只是想擺脫在下面的圖中的白色區域:Python:在contourf圖中設置零值顏色,其中需要日誌比例顏色條

enter image description here

#!/usr/bin/env python 
import numpy as np 
import matplotlib.pyplot as plt 
import scipy.interpolate 
from matplotlib import colors, ticker, cm 
from matplotlib.colors import LogNorm 
N = 100 #number of points for plotting/interpolation 

y, x, z = np.genfromtxt(r'40Ca_208Pb_39K_Ex_115deg.dat', unpack=True) 

xi = np.linspace(x.min(), x.max(), N) 
yi = np.linspace(y.min(), y.max(), N) 
zi = scipy.interpolate.griddata((x, y), z, (xi[None,:], yi[:,None]), method='linear') 

hfont = {'fontname':'Palatino'} 

fig = plt.figure(facecolor="white") 

zi = np.ma.masked_less(zi, 1e-7) 

plt.contourf(xi, yi, zi,levels=[1e-7,1e-6,1e-5,1e-4,1e-3,1e-2,1e-1],cmap=plt.cm.jet,norm = LogNorm()) 

plt.xlabel("$E_{x}$") 
plt.ylabel("$E/V_{B}$") 
plt.colorbar() 
plt.show() 
+0

如果您認爲'set_under'不能正常工作,您需要提供問題的[mcve]。在這裏,您只是屏蔽要繪製的數組,因此掩蓋的部分根本不會被繪製。您不能將任何顏色設置爲未繪製的顏色。另一方面,您可以簡單地將軸的背景顏色更改爲您喜歡的顏色。 – ImportanceOfBeingErnest

回答

0

看來,extend關鍵字不是對數刻度工作是known issuematplotlib

粗的解決方法可能是將所有的值對象轉換成繪製的範圍(注意在min_drawn_valuemax_drawn_value的意見,值必須在該範圍內):

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.colors import LogNorm 

N = 100 # number of points for plotting/interpolation 
min_exp = -8 
max_exp = -2 

min_drawn_value = 1.000001 * 10.**min_exp # above 10.**min_exp 
max_drawn_value = 0.999999 * 10.**max_exp # below 10.**max_exp 

xi = np.linspace(0, 1, N) 
yi = np.linspace(0, 1, N) 
zi = np.random.rand(N, N) *\ 
    10. ** np.random.randint(min_exp - 1, max_exp + 2, (N, N)) 
zi = np.sort(zi.flatten()).reshape(N,N) 

# Coerce values outside of colorbar range to lie within 
zi_masked = np.where(zi < 10.**min_exp, min_drawn_value, zi) 
zi_masked = np.where(zi_masked > 10.**max_exp, max_drawn_value, zi_masked) 


fig, (ax,ax2) = plt.subplots(ncols=2) 

c1 = ax.contourf(xi, yi, zi, levels=10.**np.arange(min_exp, max_exp+1), 
      cmap=plt.cm.jet, norm=LogNorm()) 

c2 = ax2.contourf(xi, yi, zi_masked, levels=10.**np.arange(min_exp, max_exp+1), 
      cmap=plt.cm.jet, norm=LogNorm()) 

ax.set_title("direct plot of array") 
ax2.set_title("coerce outlier values") 
fig.colorbar(c1, ax=ax) 
fig.colorbar(c2, ax=ax2) 
fig.subplots_adjust(wspace=0.3) 
plt.show() 

enter image description here

+1

這與問題中的代碼有多大差異?它也使用一個掩碼數組。所以外面的值不會被繪製。或者我誤解了代碼? – ImportanceOfBeingErnest

+0

在「10. 10. min_exp以上」和10. 10. max_exp以下,因爲如果這些值等於它們被繪製爲白色的限制。應該指出,將編輯。 – berna1111

+1

我明白了。我冒昧地編輯你的答案;我認爲現在更清楚了。如果您不同意,請回滾到之前的版本。 – ImportanceOfBeingErnest