代码之家  ›  专栏  ›  技术社区  ›  SaadH

Matplotlib:根据标准识别条形图中的条形图

  •  2
  • SaadH  · 技术社区  · 5 年前

    下面的代码:

    import pandas as pd
    import matplotlib.pyplot as plt
    
    data = [['Apple',10],['Banana',15],['Kiwi',11],['Orange',17]]
    df = pd.DataFrame(data,columns=['Fruit','Quantity'])
    df.set_index('Fruit', inplace=True)
    df.plot.bar(color='gray',rot=0)
    plt.show()
    

    给出以下输出:

    enter image description here

    我想为前两个数量的水果(如橘子和香蕉)绘制红色的条形图。我该怎么做?如果我的绘图足够强大,可以识别顶部两个条形图,而不是给出一个固定的阈值来改变颜色。

    2 回复  |  直到 5 年前
        1
  •  2
  •   Sheldore    5 年前

    可能有一种简单明了的方法,但我能够想出以下解决方案,原则上适用于任何数量的顶级 n 价值观。这个想法是:

    • 先得到顶部 n 要素( n=2 在下面的示例中)使用 nlargest
    • 然后,循环使用x-tick标签,并使用 if 获取其索引的语句。这里我们创建了一个轴实例 ax 以提取用于设置颜色的补丁。

    import pandas as pd
    import matplotlib.pyplot as plt
    
    fig, ax = plt.subplots()
    
    data = [['Apple',10],['Banana',15],['Kiwi',11],['Orange',17]]
    df = pd.DataFrame(data,columns=['Fruit','Quantity'])
    
    df.set_index('Fruit', inplace=True)
    df.plot.bar(color='gray',rot=0, ax=ax)
    
    top = df['Quantity'].nlargest(2).keys() # Top 2 values here
    
    for i, tick in enumerate(ax.get_xticklabels()):
        if tick.get_text() in top:
            ax.patches[i].set_color('r')
    
    plt.show()
    

    enter image description here

        2
  •  1
  •   ImportanceOfBeingErnest    5 年前

    绘制彩色条形图

    问题是大熊猫的圈地 color 用于按列应用的参数。这里有一个单列。因此,类似于标准化的对条形图着色的尝试 工作

    pd.DataFrame([12,14]).plot.bar(color=["red", "green"])
    

    解决方法是创建一个对角矩阵而不是一个单列,并用 stacked=True 选择权。

    df = pd.DataFrame([12,14])
    df = pd.DataFrame(np.diag(df[0].values), index=df.index, columns=df.index)
    df.plot.bar(color=["red", "green"], stacked=True)
    

    另一种选择是使用matplotlib。

    df = pd.DataFrame([12,14])
    plt.bar(df.index, df[0].values, color=color)
    

    根据值选择颜色

    现在的问题仍然是如何创建一个颜色列表,用于上面两个解决方案中的任何一个。给定数据帧 df 您可以创建一个与框架等长的数组,并用默认颜色填充它,然后您可以将两个最高值的条目设置为另一种颜色:

    color = np.array(["gray"]*len(df))
    color[np.argsort(df["Quantity"])[-2:]] = "red"
    

    解决方案:

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    data = [['Apple',10],['Banana',15],['Kiwi',11],['Orange',17]]
    df = pd.DataFrame(data,columns=['Fruit','Quantity'])
    df.set_index('Fruit', inplace=True)
    
    color = np.array(["gray"]*len(df))
    color[np.argsort(df["Quantity"])[-2:]] = "red"
    
    plt.bar(df.index, df.values, color=color)
    
    plt.show()
    

    enter image description here