基于值的颜色条形图

时间:2019-11-07 15:38:54

标签: python matplotlib colors bar-chart

我正在尝试根据一个值为每个条着色,如here

所述

我尝试了一个简单的代码,并且有效:

df=pd.DataFrame([95,94,99,90,89,91,92,85], columns=["Value"])
mask1 = df.Value < 90
mask2 = df.Value >= 90
bar=plt.bar( df.index[mask1],df.Value[mask1], color='red')
bar=plt.bar( df.index[mask2],df.Value[mask2], color='blue')
plt.hlines(90,0,7);

enter image description here

问题在于,当我将其应用于数据集时,列的顺序会更改。原始数据是:
         . %REALIZADAS MÊS JANEIRO 96 FEVEREIRO 86 MARÇO 94 ABRIL 96 MAIO 85 JUNHO 92 JULHO 96 AGOSTO 92 SETEMBRO 94 OUTOBRO 94 NOVEMBRO 97 DEZEMBRO 94

我用
画出来  plt.bar(coleta.index, coleta['%REALIZADAS']) plt.xticks(rotation=90)
此图的结果:

enter image description here

我尝试了这段代码:

mask1= coleta["%REALIZADAS"]>=90
mask2= coleta["%REALIZADAS"]<90
bar=plt.bar(coleta.index[mask1], coleta['%REALIZADAS'][mask1],    color="blue")
bar=plt.bar(coleta.index[mask2], coleta['%REALIZADAS'][mask2],    color="red")
plt.xticks(rotation=90)
plt.hlines(90, 0,11, color='black')

但得出此图表:

enter image description here

如何保持列的顺序?

1 个答案:

答案 0 :(得分:1)

您没有发布数据框,但我认为数据框的索引不是数字而是每个月的名称,我认为这像我在此处故意这样做的那样是在偏离列的位置:

import pandas as pd 
import matplotlib.pyplot as plt
%matplotlib inline

df=pd.DataFrame([95,94,99,90,89,91,92,85], columns=["Value"])
df.index = ["a{}".format(i) for i in range(len(df))]  #<--- my fault!

mask1 = df.Value < 90
mask2 = df.Value >= 90

bar=plt.bar( df.index[mask1],df.Value[mask1], color='red')
bar=plt.bar( df.index[mask2],df.Value[mask2], color='blue')
plt.hlines(90,0,7)

一个可能的解决方案是:

import pandas as pd 
import matplotlib.pyplot as plt
%matplotlib inline

df=pd.DataFrame([95,94,99,90,89,91,92,85], columns=["Value"])

df["colors"] = "red"
df["colors"].mask(df.Value >= 90, "blue", inplace=True)

plt.bar([i for i in range(len(df))], df["Value"], color=df["colors"])
plt.show()

我创建另一个名为colors的列,并将其初始化为所有red。然后根据条件df.Value >= 90,将适当的单元格颜色设置为blue
然后,我将其传递给带有color参数的条形图,并且为了确保索引是正确的,我只创建了一个包含0len(df)的整数的列表。

希望有帮助!