将颜色映射到特定值 df.plot

Mapping color to a particular value df.plot

我有一个包含动物名称的数据框,例如:-

cat
dog
pig
lion
tiger
goat
dog
dog
goat
pig
cat
lion

我想使用以下方法绘制水平条形图:-

c=['green','pink','blue','yellow','cyan','teal','red','violet']    
df.animal.value_counts().sort_values().plot(kind='barh', color=c, alpha=0.5)

这个效果很好。

但每次动物计数改变时,该条的颜色也会改变。

我希望动物的颜色一致,比如 "blue" 代表 "cat","green" 代表 "dog" 等等。我该怎么做呢?

这个数据集在不断发展,随着时间的推移可以有更新的动物名称,我希望确保在添加动物时自动为其分配新颜色。即使无法做到这一点,如果您能帮助完成最初的请求,我将不胜感激。

我尝试了在 Whosebug 上找到的各种选项,但没有得到我想要的。

以下方法使用字典为每只动物分配固定颜色。对于排序后的数据帧,字典应用于索引的每个元素。

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt

animals = ['cat', 'dog', 'goat', 'lion', 'pig', 'tiger']
color_dict = {'cat': 'turquoise', 'dog': 'sienna', 'goat': 'springgreen',
              'lion': 'gold', 'pig': 'deeppink', 'tiger': 'darkorange'}

fig, axs = plt.subplots(ncols=3, figsize=(12, 3))
for i, ax in enumerate(axs):
    df = pd.DataFrame({'animal': np.random.choice(animals, 40)})
    df_counts = df.animal.value_counts().sort_values()
    # c = [color_dict[a] for a in df_counts.index]
    c = df_counts.index.map(color_dict)
    df_counts.plot(kind='barh', color=c, alpha=0.8, ax=ax, title=f'test {i+1}')
    for j, cnt in enumerate(df_counts):
        ax.text(cnt, j, f'{cnt} ', ha='right', va='center', c='black')
plt.show()