使用具有阈值线的颜色图
Using Colormaps with a threshold line
我正在尝试使用颜色图来显示我的数据。我浏览了这个列表:
https://matplotlib.org/examples/color/colormaps_reference.html
我发现 RdBu 和 Seismic 数据地图适合我想用条形图实现的目标。如何将它们合并到我的代码中?
这是我一直在使用的代码:
threshold = 40000
plt.axhline(y = threshold, linewidth=1, color = 'black')
#Plot bar chart and errorbars
#plt.cla()
#data_color = [x / max(y) for x in y]
my_color = []
for k in range(0, len(xvals)):
if (smax[k] < threshold):
my_color.append('blue')
elif (smax[k] > threshold) & (smin[k] < threshold):
my_color.append('grey')
else:
my_color.append('red')
plt.bar(xvals, y, width = 1.0, tick_label = xvals, color = my_color)
plt.errorbar(xvals, y, yerr = yerr1, linestyle = '', capsize = 10, color = 'black')
这是我得到的输出:
Manually added colours. Would like them to be taken from RdBu/ Seismic
我会解释你在做什么,这可能会帮助你调试问题。
np.linespace
np.linspace(.1, .9, 10)
returns 0.1 - 0.9 区间内的 10 个均匀分布的数字:
[0.1 0.18888889 0.27777778 0.36666667 0.45555556 0.544444440.63333333 0.72222222 0.81111111 0.9]
cm.seismic
然后你在cm.seismic
上输入上面的数组。这将为 linspace
从蓝色到红色的每个点赋予颜色值。
所以通过调用 cm.seismic(np.linspace(.1, .9, 10))
你得到这个颜色映射:
Red Green Blue Alpha (Opacity)
[0. 0. 0.5745098 1. ]
[0. 0. 0.82705882 1. ]
[0.11372549 0.11372549 1. 1. ]
[0.45882353 0.45882353 1. 1. ]
[0.81960784 0.81960784 1. 1. ]
[1. 0.81960784 0.81960784 1. ]
[1. 0.45882353 0.45882353 1. ]
[1. 0.11372549 0.11372549 1. ]
[0.87647059 0. 0. 1. ]
[0.69607843 0. 0. 1. ]
所以你的数据的第一个点将得到上面数组的第一行作为它的颜色值等等。
plt.bar
在您的例子中,您绘制了 4 个数据点(条)。因此,第一个条形图的第一行颜色为深蓝色 (0. 0. 0.5745098 1.
)。
在您的数据上有 4 个条形,您将只使用颜色图的前 4 行,永远不会达到红色。
我用来重现你的问题的代码:
import numpy as np
import matplotlib.pyplot as plt
xvals = [0,1,2,3]
y = np.array([30000,35000,40000,50000])
cmap=plt.get_cmap("seismic")
print(np.linspace(.1, .9, 10))
my_colors = cmap(np.linspace(.1, .9, 10))
print(my_colors)
plt.bar(xvals, y, width = 1.0, tick_label = xvals, color=my_colors)
plt.show()
最后 如果你想实现特定的输出,请编辑你的问题,我会更新我的答案。
我正在尝试使用颜色图来显示我的数据。我浏览了这个列表: https://matplotlib.org/examples/color/colormaps_reference.html
我发现 RdBu 和 Seismic 数据地图适合我想用条形图实现的目标。如何将它们合并到我的代码中?
这是我一直在使用的代码:
threshold = 40000
plt.axhline(y = threshold, linewidth=1, color = 'black')
#Plot bar chart and errorbars
#plt.cla()
#data_color = [x / max(y) for x in y]
my_color = []
for k in range(0, len(xvals)):
if (smax[k] < threshold):
my_color.append('blue')
elif (smax[k] > threshold) & (smin[k] < threshold):
my_color.append('grey')
else:
my_color.append('red')
plt.bar(xvals, y, width = 1.0, tick_label = xvals, color = my_color)
plt.errorbar(xvals, y, yerr = yerr1, linestyle = '', capsize = 10, color = 'black')
这是我得到的输出: Manually added colours. Would like them to be taken from RdBu/ Seismic
我会解释你在做什么,这可能会帮助你调试问题。
np.linespace
np.linspace(.1, .9, 10)
returns 0.1 - 0.9 区间内的 10 个均匀分布的数字:
[0.1 0.18888889 0.27777778 0.36666667 0.45555556 0.544444440.63333333 0.72222222 0.81111111 0.9]
cm.seismic
然后你在cm.seismic
上输入上面的数组。这将为 linspace
从蓝色到红色的每个点赋予颜色值。
所以通过调用 cm.seismic(np.linspace(.1, .9, 10))
你得到这个颜色映射:
Red Green Blue Alpha (Opacity)
[0. 0. 0.5745098 1. ]
[0. 0. 0.82705882 1. ]
[0.11372549 0.11372549 1. 1. ]
[0.45882353 0.45882353 1. 1. ]
[0.81960784 0.81960784 1. 1. ]
[1. 0.81960784 0.81960784 1. ]
[1. 0.45882353 0.45882353 1. ]
[1. 0.11372549 0.11372549 1. ]
[0.87647059 0. 0. 1. ]
[0.69607843 0. 0. 1. ]
所以你的数据的第一个点将得到上面数组的第一行作为它的颜色值等等。
plt.bar
在您的例子中,您绘制了 4 个数据点(条)。因此,第一个条形图的第一行颜色为深蓝色 (0. 0. 0.5745098 1.
)。
在您的数据上有 4 个条形,您将只使用颜色图的前 4 行,永远不会达到红色。
我用来重现你的问题的代码:
import numpy as np
import matplotlib.pyplot as plt
xvals = [0,1,2,3]
y = np.array([30000,35000,40000,50000])
cmap=plt.get_cmap("seismic")
print(np.linspace(.1, .9, 10))
my_colors = cmap(np.linspace(.1, .9, 10))
print(my_colors)
plt.bar(xvals, y, width = 1.0, tick_label = xvals, color=my_colors)
plt.show()
最后 如果你想实现特定的输出,请编辑你的问题,我会更新我的答案。