如何在 matplotlib 中根据 x 轴更改直方图颜色

Posted

技术标签:

【中文标题】如何在 matplotlib 中根据 x 轴更改直方图颜色【英文标题】:How to change histogram color based on x-axis in matplotlib 【发布时间】:2022-01-09 02:48:35 【问题描述】:

我有这个从熊猫数据框计算出来的直方图。

我想根据 x 轴值更改颜色。 例如:

If the value is = 0 the color should be green
If the value is > 0 the color should be red
If the value is < 0 the color should be yellow  

我只关心 x 轴。酒吧的高度对我来说并不重要。所有其他解决方案均针对 y 轴。

【问题讨论】:

【参考方案1】:

对于ax.containers[0] 中的每个条形补丁,根据x 位置使用set_color

get_x 返回左边缘,所以通过添加一半 get_width 得到中点 x 可能不会完全为 0,因此请使用一些缓冲区(本例中为 0.2)进行测试

既然你asked for pandas in the comments,这个例子使用DataFrame.plot.hist,但你可以用任何基于matplotlib的直方图/条形图来做到这一点:

df = pd.DataFrame('A': np.random.default_rng(222).uniform(-1, 1, 40))
ax = df.plot.hist()

for bar in ax.containers[0]:
    # get x midpoint of bar
    x = bar.get_x() + 0.5 * bar.get_width()

    # set bar color based on x
    if x < -0.2:
        bar.set_color('orange')
    elif x > 0.2:
        bar.set_color('red')
    else:
        bar.set_color('green')

【讨论】:

【参考方案2】:

一张一张地画出来:

import matplotlib as mpl
import matplotlib.pyplot as plt

x = np.linspace(-1,1,10)
y = np.random.uniform(0,1,10)
width = 0.2
plt.figure(figsize = (12, 6))
cmap = mpl.cm.RdYlGn.reversed()
norm = mpl.colors.Normalize(vmin=0, vmax=10)
for x0, y0 in zip(x,y):
    plt.bar(x0, y0, width = width, color = cmap(norm(np.abs(x0*10))))

【讨论】:

我想根据 x 轴上的值改变颜色。 @roger 这是根据 x 轴更改的 color = cmap(norm(np.abs(x0*10))) @Z li 你能解释一下代码中发生了什么吗?当我将我的数据插入整个事情时,它会变成绿色?就像一个绿色的正方形。 颜色由颜色图cmap 确定,并标准化为[0, 10] 的范围。在颜色部分,我相应地设置了x0 给出的颜色。因为这里x0 的值很小(-1 到 1),所以我将它乘以 10。如果你得到全绿色,可能是因为你的 x 值太小(小值变绿,大值变红)跨度> 另外,如果你得到一个很大的正方形,那可能是因为你将条形的width 设置得太大了

以上是关于如何在 matplotlib 中根据 x 轴更改直方图颜色的主要内容,如果未能解决你的问题,请参考以下文章

在Python matplotlib中更改X轴步骤[重复]

在python上使用matplotlib挤压x轴图形比例[重复]

在 matplotlib 中更改日期时间轴的格式

如何在 matplotlib 条形图上旋转 x 轴刻度标签?尝试了几种方法,都没有奏效

如何在 matplotlib 条形图上旋转 x 轴刻度标签?尝试了几种方法,都没有奏效

如何更改 matplotlib 中 y 轴上方 sci 符号的大小?