首页 > 解决方案 > 使用带有阈值线的颜色图

问题描述

我正在尝试使用颜色图来显示我的数据。我浏览了这个列表: 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')

这是我得到的输出: 手动添加颜色。希望它们取自 RdBu/Seismic

标签: pythonmatplotlibcolormap

解决方案


我会解释你在做什么,这可能会帮助你调试你的问题。

np.linespace

np.linspace(.1, .9, 10)在 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.地震

然后你输入上面的数组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()

最后,如果您试图实现特定的输出,请编辑您的问题,我会更新我的答案。


推荐阅读