【问题标题】:Matplotlib: Identify bars in bar plot based on criteriaMatplotlib:根据标准识别条形图中的条形图
【发布时间】:2019-06-23 22:56:28
【问题描述】:

以下代码:

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()

给出以下输出:

我想为数量最多的两种水果(即橙子和香蕉)绘制红色条形图。我怎样才能做到这一点?与其给出一个固定的阈值来改变颜色,我更喜欢我的图足够健壮以识别前两个条。

【问题讨论】:

    标签: python pandas matplotlib bar-chart


    【解决方案1】:

    可能有一种直接且更简单的方法,但我能够提出以下解决方案,该解决方案原则上适用于任意数量的顶级 n 值。这个想法是:

    • 首先使用nlargest从DataFrame中获取顶部的n元素(下例中的n=2
    • 然后,循环遍历 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()
    

    【讨论】:

      【解决方案2】:

      绘制彩色条形图

      问题在于 pandas 条形图采用 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()
      

      【讨论】:

        猜你喜欢
        • 2018-08-22
        • 2017-03-27
        • 1970-01-01
        • 2017-03-10
        • 2015-12-25
        • 2016-01-02
        • 2017-07-20
        • 2018-11-29
        相关资源
        最近更新 更多