Seaborn-根据色相名称更改条形颜色

发布于 2021-01-29 17:15:00

我正在使用,seabornpandas根据不同(但相关)的数据创建一些条形图。这两个数据集共享一个用作的公共类别hue,因此,我想确保在两个图中该类别的条形颜色匹配。我该怎么办?

基本示例如下:

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
sns.set_style('darkgrid')
fig, ax = plt.subplots()

a = pd.DataFrame({'Program': ['A', 'A', 'B', 'B', 'Total', 'Total'],
                  'Scenario': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
                  'Duration': [4, 3, 5, 4, 9, 7]})

g = sns.barplot(data=a, x='Scenario', y='Duration',
                hue='Program', ci=None)
plt.tight_layout()
plt.savefig('3 progs.png')

plt.clf()

b = pd.DataFrame({'Program': ['A', 'A', 'B', 'B', 'C', 'C', 'Total', 'Total'],
                  'Scenario': ['X', 'Y', 'X', 'Y', 'X', 'Y', 'X', 'Y'],
                  'Duration': [4, 3, 5, 4, 3, 2, 12, 9]})

g = sns.barplot(data=b, x='Scenario', y='Duration',
                hue='Program', ci=None)
plt.tight_layout()
plt.savefig('4 progs.png')

在此示例中,我想确保Total类别在两个图表中使用相同的颜色(例如黑色)

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    A.使用颜色列表

    确保在两个图中相同类别的颜色相同的最简单解决方案是在创建绘图时手动指定颜色。

    # First bar plot
    ax = sns.barplot(data=a, x='Scenario', y='Duration',
                     hue='Program', ci=None, palette=["C0", "C1", "k"])
    
    # ...
    # Second bar plot
    ax2 = sns.barplot(data=b, x='Scenario', y='Duration',
                      hue='Program', ci=None, palette=["C0", "C1", "C2", "k"])
    

    颜色"C2"(颜色周期的第三种颜色)仅存在于存在程序C的第二个图中。

    B.使用字典

    除了列表以外,您还可以使用字典,将hue列中的值映射到颜色。

    palette ={"A": "C0", "B": "C1", "C": "C2", "Total": "k"}
    
    ax = sns.barplot(data=a, x='Scenario', y='Duration', hue='Program', palette=palette)
    # ...
    ax2 = sns.barplot(data=b, x='Scenario', y='Duration', hue='Program', palette=palette)
    

    C.自动词典

    最后,您可以根据hue列中的值自动创建此词典。这样做的好处是您不需要事先知道颜色,也不需要知道各个数据框中的值。

    import seaborn as sns
    import pandas as pd
    import matplotlib.pyplot as plt
    sns.set_style('darkgrid')
    fig, ax = plt.subplots()
    
    a = pd.DataFrame({'Program': ['A', 'A', 'B', 'B', 'Total', 'Total'],
                      'Scenario': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
                      'Duration': [4, 3, 5, 4, 9, 7]})
    b = pd.DataFrame({'Program': ['A', 'A', 'B', 'B', 'C', 'C', 'Total', 'Total'],
                      'Scenario': ['X', 'Y', 'X', 'Y', 'X', 'Y', 'X', 'Y'],
                      'Duration': [4, 3, 5, 4, 3, 2, 12, 9]})
    
    unique = a["Program"].append(b["Program"]).unique()
    palette = dict(zip(unique, sns.color_palette(n_colors=len(unique))))
    palette.update({"Total":"k"})
    
    ax = sns.barplot(data=a, x='Scenario', y='Duration',
                     hue='Program', ci=None, palette=palette)
    plt.tight_layout()
    plt.figure()
    
    ax2 = sns.barplot(data=b, x='Scenario', y='Duration',
                      hue='Program', ci=None,  palette=palette)
    plt.tight_layout()
    plt.show()
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看