2017-08-24 289 views
0

我一直在研究一些數據繪圖功能的Python和一個這樣的工具,我需要我的研究是一組差異圖表來比較兩組數據之間的變化。Matplotlib自定義漸變漸變忽略顏色

我現在想要繪製我的數據,並且正在研究創建自定義顏色貼圖來處理髮散數據,但是,我所有的繪圖遠遠地忽略了我的漸變中的特定步驟,或者顏色正在重複我的低值。

下面是已生成的示例圖: enter image description here

而對於我的兩個自定義顏色映射代碼,以及繪圖:

diffmap_17 = ["#FF0000", "#F81318", "#F12731", "#EB3B4A", "#EB5C66", "#EB7D82", "#EB9E9E", "#F1BEBE", "#F8DEDE", "#FFFFFF", "#DDDCFD", "#BCB9FB", "#9B96FA", "#6A6CFA", "#3A43FA", "#1D21FC", "#0000FF"] 
diffmap_17_colormap = matplotlib.colors.ListedColormap(diffmap_17) 

contour_levels = [-20, -10, -5, -2, -1, -0.75, -0.5, -0.25, -0.1, 0.0, 0.1, 0.25, 0.5, 0.75, 1, 2, 5, 10, 20] 
cs = m.contourf(x,y,data,contour_levels,cmap=diffmap_17_colormap) #plot total 

我的目標是有彩色地圖零點爲白色,然後向外發散(紅色爲負值,藍色爲正值)。目前,我正在使用標準色彩映射,但使用自定義色彩映射將是首選。

任何幫助將不勝感激。謝謝!

+2

您的數據可能不是您所相信的。沒有[mcve]難以幫助... – Julien

+2

我同意@Julien。從你在圖片中顯示的內容來看,你可能有一些很難看到的極端值,其餘所有數據都在-1和1之間的範圍內。你是否試圖改變極限('vmin'和'vmax ')。另外,如果你的數據是像netcdf這樣的標準格式之一,那麼有很多工具可以幫助你快速查看你的文件。例如,對於netcdf文件,我喜歡用'ncview'預先檢查我的數據。 –

+0

與@Thomas和Julien的建議不同,這個問題主要與數據無關,因爲這些級別是明確指定的。純粹是如何定義要使用的顏色範圍。下面的答案中顯示了兩個選項。事實上,完整的地圖是相同的顏色,然而也會允許更嚴格的水平(範圍從-10到10可能就足夠了)。儘管朱利安在提出這樣的問題時應該給出一個[mcve]是完全正確的(請記住下次要問)。 – ImportanceOfBeingErnest

回答

1

問題是,通過將最小值和最大值之間的範圍除以相等部分,從顏色地圖中選擇顏色。由於大多數關卡彼此非常接近,因此它們落入相同的範圍,因此具有相同的顏色。

最簡單的解決方案不是使用顏色映射,而是每個級別都從顏色列表中獲取顏色的圖。在這種情況下,您可以將顏色列表直接提供給contourf圖。

plt.contourf(x,y,data,contour_levels,colors=diffmap_17) 

注意,因爲你有19個級別的列表,然後將需要18種顏色(因此我加一個)。

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

x, y= np.meshgrid(np.linspace(-3,3), np.linspace(-3,3)) 
r = np.sqrt(x**2+y**2) 
data = np.tan((r*0.7-1.5))*1.3 

diffmap_17 = ["#FF0000", "#F81318", "#F12731", "#EB3B4A", "#EB5C66", "#EB7D82", 
       "#EB9E9E", "#F1BEBE", "#F8DEDE", "#FFFFFF", "#DDDCFD", "#BCB9FB", 
       "#9B96FA", "#6A6CFA", "#3A43FA", "#1D21FC", "#0000FF", "#0000ce"] 

contour_levels = [-20, -10, -5, -2, -1, -0.75, -0.5, -0.25, -0.1, 0.0, 
        0.1, 0.25, 0.5, 0.75, 1, 2, 5, 10, 20] 
cs = plt.contourf(x,y,data,contour_levels,colors=diffmap_17) 

plt.colorbar(cs) 

plt.show() 

enter image description here

如果你想使用一個顏色表,而不是,你需要一起提供一個標準化的實例與色彩表。 A matplotlib.colors.BoundaryNorm會根據提供給它的邊界列表選擇顏色,這將是等高線圖的等級列表。

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

x, y= np.meshgrid(np.linspace(-3,3), np.linspace(-3,3)) 
r = np.sqrt(x**2+y**2) 
data = np.tan((r*0.7-1.5))*1.3 

diffmap_17 = ["#FF0000", "#F81318", "#F12731", "#EB3B4A", "#EB5C66", "#EB7D82", 
       "#EB9E9E", "#F1BEBE", "#F8DEDE", "#FFFFFF", "#DDDCFD", "#BCB9FB", 
       "#9B96FA", "#6A6CFA", "#3A43FA", "#1D21FC", "#0000FF", "#0000ce"] 
diffmap_17_colormap = matplotlib.colors.ListedColormap(diffmap_17) 

contour_levels = [-20, -10, -5, -2, -1, -0.75, -0.5, -0.25, -0.1, 0.0, 
        0.1, 0.25, 0.5, 0.75, 1, 2, 5, 10, 20] 
norm = matplotlib.colors.BoundaryNorm(contour_levels, diffmap_17_colormap.N) 
cs = plt.contourf(x,y,data,contour_levels,cmap=diffmap_17_colormap, norm=norm) 

plt.colorbar(cs) 

plt.show() 

輸出圖與上面相同。

+0

我認爲OP只有17個色階的原因是因爲他希望色階以'色彩爲中心',也就是說實際的等高線會在定義的色階和色階上的刻度之間, - 這至少是我想要的。這通常對於白色級別特別有意義,因爲「可忽略」(接近零)值不會顯示出趨勢。也許OP可以對此發表評論...無論如何,我的+1。 –

+0

@Thomas正確的,把邊界對稱爲零通常可能更有意義;但對於那個人確實需要開始解釋數據,那時我已經失去了多少可能會出現負降水(可能是因爲如果有更多的水蒸發,而不是降雨下降,那麼顯示這種趨勢可能確實存在需要的話)。 – ImportanceOfBeingErnest

+0

OP顯示的是一個差異圖 - 兩個模型運行不同的設置或可能不同的算法來計算降水量。在開發這樣的模型時,你經常這樣做。無論如何,你是對的,這超出了這個問題的範圍。 –