【问题标题】:Color barchart based on value基于值的彩色条形图
【发布时间】:2020-03-04 05:41:10
【问题描述】:

我正在尝试根据值为每个条形着色,如 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')

但是导致了这个图表:

如何保持列的顺序?

【问题讨论】:

    标签: python matplotlib colors bar-chart


    【解决方案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 &gt;= 90我将相应的单元格颜色设置为blue
    然后我将它传递给带有color 参数的条形图,并确保索引是正确的,我只需创建一个包含从0len(df) 的整数的列表。

    希望对你有帮助!

    【讨论】:

    • 你对索引中的名字很感兴趣。我编辑问题。您的示例有效,但未在 x-label 处显示名称。我该怎么做?
    • plt.xticks(ticks=[i for i in range(len(df))], labels=["a" for i in range(len(df))])。显然用你想要的替换标签
    猜你喜欢
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 2020-02-26
    • 2016-10-17
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    相关资源
    最近更新 更多