按特定顺序组织饼图中的颜色?

organizing colors in a pie chart in a specific sequence?

我有一个包含车辆颜色的数据框。它看起来类似于:

    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

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

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

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

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

如果您写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' 列设置为索引,pandas 绘图会将其显示为标签。这有助于验证颜色是否正确。

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