我正在尝试根据一个值为每个条着色,如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);
问题在于,当我将其应用于数据集时,列的顺序会更改。原始数据是:
. %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)
此图的结果:
我尝试了这段代码:
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')
但得出此图表:
如何保持列的顺序?
答案 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
参数的条形图,并且为了确保索引是正确的,我只创建了一个包含0
至len(df)
的整数的列表。
希望有帮助!