在每个标签的堆积条形图中设置颜色

时间:2019-05-15 17:01:05

标签: pandas plot bar-chart visualization seaborn

我想设置每次运行此barplot时都会弹出的相同颜色。例如: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)

enter image description here

这有效,但是一旦我有新数据,它就会为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)

enter image description here

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

1 个答案:

答案 0 :(得分:0)

创建一个词典并将列映射到这些颜色。由于我们在列上进行迭代,因此颜色的绘制顺序与列的绘制顺序相同。您将需要为所有不同的列定义颜色。

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

enter image description here

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

enter image description here


但是,这不能确保顺序一致。也就是说,如果您的DataFrame排序不同,尽管B3始终是相同的颜色,但是堆叠时它可能会高于B1或低于B1。一个更一致的解决方案是重新索引。您必须包括在所有需要一致绘制的数据框中找到的所有 Bi。在这里,我选择了任意数量的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)

enter image description here

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