基于valu的彩色条形图

2024-10-02 22:24:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图根据一个值为每个条上色,如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

如何保持列的顺序


Tags: dfindex顺序valuebarpltbluered
1条回答
网友
1楼 · 发布于 2024-10-02 22:24:35

你没有发布你的数据框,但是我假设你的数据框的索引不是数字而是每个月的名称,我假设这是摆脱了列的定位,就像我在这里故意做的那样:

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的列,并将其初始化为allred。然后根据条件df.Value >= 90,我将适当的单元格颜色设置为blue
然后我用color参数将其传递给条形图,为了确保索引是正确的,我只创建了一个从0len(df)的整数列表

希望有帮助

相关问题 更多 >