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

Pandas 在每个标签的堆叠条形图中设置颜色,pandas,plot,bar-chart,visualization,seaborn,Pandas,Plot,Bar Chart,Visualization,Seaborn,我想设置每次运行此条形图时弹出的相同颜色。例如: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)

我想设置每次运行此条形图时弹出的相同颜色。例如: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在这里是橙色的,而第一个是绿色的

创建一个字典并将列映射到这些颜色。因为我们在列上迭代,所以颜色的顺序与列的打印顺序相同。您需要为所有不同的列定义颜色

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


然而,这并不能确保顺序是一致的。也就是说,如果您的数据帧的顺序不同,尽管B3始终是相同的颜色,但在堆叠时它可能会高于或低于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)


虽然B3首先出现在数据框中,但它仍然绘制在B1上方,并在循环中使用第三种颜色。

创建一个字典并将列映射到这些颜色。因为我们在列上迭代,所以颜色的顺序与列的打印顺序相同。您需要为所有不同的列定义颜色

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


然而,这并不能确保顺序是一致的。也就是说,如果您的数据帧的顺序不同,尽管B3始终是相同的颜色,但在堆叠时它可能会高于或低于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)


虽然B3在数据框中出现在第一位,但它仍然绘制在B1上方,并在循环中使用第三种颜色。

您能用代码显示它吗,很抱歉,我无法描绘它。。我还添加了一些玩具数据。
toy1=pd.DataFrame(data=t)。reindex(['DAY','B1','B2','B3'],axis=1)
是@ALollz所指的。@shaucha是的,它在所有情况下都有效。您需要为每个帧的数据中找到的所有
B_i
集合重新编制索引,而不仅仅是一个随机子样本。您可以在代码中显示它吗,对不起,我无法描绘这一点。。我还添加了一些玩具数据。
toy1=pd.DataFrame(data=t)。reindex(['DAY','B1','B2','B3'],axis=1)
是@ALollz所指的。@shaucha是的,它在所有情况下都有效。您需要为每个帧的数据中找到的所有
B_i
集合重新编制索引,而不仅仅是一个随机子样本。