我想设置每次运行此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)
这有效,但是一旦我有新数据,它就会为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在这里是橙色,而第一个是绿色。
答案 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))
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或低于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首先出现在DataFrame中,但它仍然绘制在B1上方,并且在循环中显示第三种颜色。