使用不同颜色的Python绘制直方图,以显示正值和负值

使用不同颜色的Python绘制直方图,以显示正值和负值,python,python-3.x,matplotlib,Python,Python 3.x,Matplotlib,我使用Python完成了以下绘图: import matplotlib.pyplot as plt plt.hist([x*100 for x in relativeError], bins = 100) plt.xlabel("Relative Error [%]") plt.ylabel("#samples") plt.axvline(x=0, linestyle='--',linewidth=1, color='grey') 但我真正想要的是根据值是正值还是负值而有不同的颜色。\35;

我使用Python完成了以下绘图:

import matplotlib.pyplot as plt
plt.hist([x*100 for x in relativeError], bins = 100)
plt.xlabel("Relative Error [%]")
plt.ylabel("#samples")
plt.axvline(x=0, linestyle='--',linewidth=1, color='grey')

但我真正想要的是根据值是正值还是负值而有不同的颜色。

\35;
将numpy作为np导入
将matplotlib.pyplot作为plt导入
#伪造数据集
高度=[3,12,5,18,45]
条形图=('A','B','C','D','E')
y_pos=np.arange(长(条))
现在,让我们研究3个颜色利用示例:

使用RGB的均匀颜色 RGB是一种制作颜色的方法。你必须提供一定量的红色、绿色和蓝色+透明度,它会返回一种颜色

plt.bar(y位置,高度,颜色=(0.2,0.4,0.6,0.6))
plt.xticks(y_位置,棒材)
plt.show()

首先,您需要计算直方图中条形图的高度和位置。然后,您需要创建一个掩码来过滤正负数据。最后,分别绘制每个条形图子集,并在每次调用函数
plt.bar()
时设置颜色

与您的数据相似的假数据示例:

导入matplotlib.pyplot作为plt
将numpy作为np导入
#生成假数据
N=1000
数据=np.随机.正常(loc=-1,大小=N)#平均值为-1
n_bins=100
高度,料仓,=plt.hist(数据,料仓=n个料仓)#获取钢筋的位置和高度
箱柜宽度=np.差异(箱柜)[0]
仓位=仓位[:-1]+仓位宽度/2
plt.图()
掩码=(bin_pos>=0)
#分两步绘制数据
plt.bar(箱位[遮罩]、高度[遮罩]、宽度=箱位宽度、颜色='C1')
plt.bar(料仓位置[~mask],高度[~mask],宽度=料仓宽度,颜色为C0')
plt.xlabel(“相对误差[%]”)
plt.ylabel(“样本”)
plt.axvline(x=0,线型='--',线宽=1,颜色='灰色')
plt.show()

你可以在事后给这些条上色

import numpy as np
import matplotlib.pyplot as plt

x = np.random.normal(-20, 15, 5000)

_, _, bars = plt.hist(x, bins = 100, color="C0")
for bar in bars:
    if bar.get_x() > 0:
        bar.set_facecolor("C1")
plt.xlabel("Relative Error [%]")
plt.ylabel("#samples")
plt.axvline(x=0, linestyle='--',linewidth=1, color='grey')
plt.show()

相反,如果您想要绘制一个历史记录值的条形图(如另一个答案所示),它看起来更像

import numpy as np
import matplotlib.pyplot as plt

x = np.random.normal(-20, 15, 5000)

hist, edges = np.histogram(x, bins=100)

colors = np.array(["C0", "C1"])[(edges[:-1] > 0).astype(int)]
plt.bar(edges[:-1], hist, width=np.diff(edges), align="edge", color=colors)
plt.xlabel("Relative Error [%]")
plt.ylabel("#samples")
plt.axvline(x=0, linestyle='--',linewidth=1, color='grey')
plt.show()

你需要划分2个子地块。将正值拆分为一个数组,将负值拆分为一秒。然后使用所需的
facecolor=color\u name
为这两个数组中的每一个分别生成历史图(子图)。然后将这些子图合并到单个绘图中。@rocker996提供示例数据