【问题标题】:organizing colors in a pie chart in a specific sequence?按特定顺序组织饼图中的颜色?
【发布时间】:2020-12-16 07:58:46
【问题描述】:

我有一个包含车辆颜色的数据框。它看起来像这样:

    paint_color count
0   black       4821
1   blue        2850
2   brown       784
3   custom      755
4   green       887
5   grey        3221
6   orange      144
7   purple      66
8   red     2858
9   silver      4034
10  white       6096
11  yellow      127

我已经导入了 pandas 和 matplotlib.pyplot(作为情节)

我正在绘制一个饼图来显示每种颜色的计数 - 当然,我真的很希望颜色与……颜色相对应……所以我建立了一个颜色字典:

colors = ({'custom': 'black',"black": 'black', "blue": 'blue', "brown":'brown','custom': 'cyan',"green": 'green',"grey":'grey',"orange":'orange',"purple":'purple',"red":'red', "silver":'silver',"white":'gray',"yellow":'yellow'})

然后我开始使用此代码进行绘图:

df.plot(kind='pie', y='count',figsize=(15,15), fontsize = 14,colors = colors)

但我收到以下错误:

ValueError: Invalid RGBA argument:custom

现在,如果我在查询中选择除自定义值之外的所有值,这些值会按照我期望的方式排列(并且工作正常)

我不确定的是 - 是否因为无法识别“自定义”而创建错误?正如我一直在阅读此错误,似乎它可能是由不太明显的问题引发的,所以我想知道这是否是我所面临的?

【问题讨论】:

    标签: python matplotlib pie-chart colormap


    【解决方案1】:

    如果你写df.plot.pie(..., colors=colors),则使用字典的键列表。因此,它与df.plot.pie(..., colors=['custom', 'black', 'blue', 'brown', 'green', 'grey', 'orange', 'purple', 'red', 'silver', 'white', 'yellow']) 相同。除了无效的颜色名称之外,这也很大程度上取决于字典的键顺序与数据帧的顺序相比。此外,使用colors.values() 会给出有效的颜色名称,但仍然存在排序不匹配的问题。

    要正常工作,列中的每个值都需要使用颜色字典进行映射。通过df['paint_color'].map(colors)[colors[p] for p in df['paint_color']]

    如果您将“paint_color”列设置为索引,熊猫绘图将其显示为标签。这有助于验证颜色是否正确。

    from matplotlib import pyplot as plt
    import pandas as pd
    from io import StringIO
    
    df_str = '''    paint_color count
    0   black       4821
    1   blue        2850
    2   brown       784
    3   custom      755
    4   green       887
    5   grey        3221
    6   orange      144
    7   purple      66
    8   red         2858
    9   silver      4034
    10  white       6096
    11  yellow      127'''
    df = pd.read_csv(StringIO(df_str), delim_whitespace=True)
    colors = ({'custom': 'turquoise', 'black': 'black', 'blue': 'blue', 'brown': 'brown', 'green': 'green',
               'grey': 'grey', 'orange': 'orange', 'purple': 'purple', 'red': 'red', 'silver': 'silver',
               'white': 'antiquewhite', 'yellow': 'yellow'})
    
    df.set_index('paint_color').plot(kind='pie', y='count', figsize=(15, 15), fontsize=14,
                                     colors=[colors[p] for p in df['paint_color']])
    plt.show()
    

    PS:请注意,在问题的字典中,键'custom'出现了两次。一次以'black' 排名第一,一次以'cyan' 排名第六。

    可以在Wikipedia 找到有效颜色名称的列表。

    馅饼楔之间的细线可能很烦人,尤其是对于薄楔。可以将线宽设置为零以删除它们:

    df.set_index('paint_color').plot(kind='pie', y='count', figsize=(15, 15), fontsize=14,
                                     colors=df['paint_color'].map(colors), wedgeprops={'linewidth': 0})
    

    【讨论】:

      【解决方案2】:

      您应该传递字典的值而不是它们的键,否则您传递的是“自定义”,python 不会识别它。我建议你试试这个:

      df.plot(kind='pie', y='count',figsize=(15,15), fontsize = 14,colors = colors.values())
      

      【讨论】:

      • @seuadr 您确定颜色的应用顺序正确吗?使用示例代码,这将为楔形着色 black, black, blue, brown, cyan, ... 而不是 black, blue, brown, ...
      猜你喜欢
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      相关资源
      最近更新 更多