【问题标题】:Set colors in stacked bar plot per label在每个标签的堆积条形图中设置颜色
【发布时间】:2019-10-02 21:25:27
【问题描述】:

我想在每次运行此条形图时设置相同的颜色。例如:B1 = 绿色、B2、红色、B3 = 蓝色等。

到目前为止,我已经尝试过 .setcolor,但它没有让我为单个框号(B1、B2 等)设置颜色——我想不通。

import pandas as pd
import seaborn as sns


d = {'DAY': [55,56,58,65], 'B1': [2,6,6,1],  'B2': [1,0,21,0], 'B3': [0,1,0,1]}
data1= pd.DataFrame(data = d)

sns.set()
data1.set_index('DAY').plot(kind='bar', stacked=True)

这可行,但一旦我有新数据,它会为 B1、B2、B3 等分配不同的颜色..

例如,让我们给它一些玩具数据:

t = {'DAY': [55,56,58,65], 'B1': [2,6,6,1],  'B3': [0,1,0,1]}
toy1= pd.DataFrame(data = t)
sns.set()
toy1.set_index('DAY').plot(kind='bar', stacked=True)

B3 在这里是橙色的,而第一个是绿色的。

【问题讨论】:

  • 你能用代码显示吗,对不起,我无法想象。我还添加了一些玩具数据。
  • toy1= pd.DataFrame(data = t).reindex(['DAY', 'B1', 'B2', 'B3'], axis=1) 是 @ALollz 所指的。
  • @shaucha 是的,它确实适用于所有场景。您需要为每一帧的数据中找到的所有 B_i 集合重新索引,而不仅仅是随机子样本。

标签: pandas plot bar-chart visualization seaborn


【解决方案1】:

创建一个字典并将列映射到这些颜色。因为我们遍历列,所以颜色将与列的绘制顺序相同。您需要为所有不同的列定义颜色。

def gen_colors(df):
    col_d = {'B1': 'red', 'B2': 'black', 'B3': 'green'}
    return [col_d[col] for col in df.columns if 'B' in col]

sns.set()

d = {'DAY': [55,56,58,65], 'B1': [2,6,6,1],  'B2': [1,0,21,0], 'B3': [0,1,0,1]}
data1 = pd.DataFrame(data = d)
data1.set_index('DAY').plot(kind='bar', stacked=True, color=gen_colors(data1))

t = {'DAY': [55,56,58,65], 'B1': [2,6,6,1],  'B3': [0,1,0,1]}
toy1 = pd.DataFrame(data = t)
toy1.set_index('DAY').plot(kind='bar', stacked=True, color=gen_colors(toy1))


但是,这并不能确保顺序一致。也就是说,如果您的 DataFrame 的顺序不同,尽管 B3 始终是相同的颜色,但在堆叠时它可能会高于或低于 B1。更一致的解决方案是重新索引。您必须包含 all Bi,它们可以在所有需要一致绘制的 DataFrame 中找到。这里我选择了一个任意大的1-9:

t = {'DAY': [55,56,58,65], 'B3': [0,1,0,1], 'B1': [2,6,6,1]}
toy1 = pd.DataFrame(data = t)

toy1 = toy1.reindex(['DAY'] + [f'B{i}' for i in range(1,10)], axis=1)
toy1.set_index('DAY').plot(kind='bar', stacked=True)

虽然 B3 首先出现在 DataFrame 中,但它仍然绘制在 B1 上方,并且是循环中的第三种颜色。

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 2020-12-29
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多