使用python seaborn为具有不同权重的多维数据绘制离散彩色地图

使用python seaborn为具有不同权重的多维数据绘制离散彩色地图,python,multidimensional-array,seaborn,colormap,Python,Multidimensional Array,Seaborn,Colormap,我有一个如下所示的数据集: df = pd.DataFrame({"Sunday": {'a1':0.1,'a2':0.15,'a4':0.05,'a6':0.1,'b2':0.05,'b3':0.05,'b4':0.2,'c1':0.15,'c4':0.15}, "Monday": {'a2':0.05,'a3':0.15,'a5':0.25,'b1':0.05,'b3':0.1,'b4':0.1,'c3

我有一个如下所示的数据集:

df = pd.DataFrame({"Sunday":    {'a1':0.1,'a2':0.15,'a4':0.05,'a6':0.1,'b2':0.05,'b3':0.05,'b4':0.2,'c1':0.15,'c4':0.15},
                   "Monday":    {'a2':0.05,'a3':0.15,'a5':0.25,'b1':0.05,'b3':0.1,'b4':0.1,'c3':0.1,'c5':0.05,'c7':0.15},
                   "Tuesday":   {'a1':0.2,'a3':0.15,'a6':0.05,'b2':0.35,'b3':0.05,'c1':0.1,'c4':0.1},
                   "Wednesday": {'a2':0.05,'a3':0.05,'a4':0.35,'a6':0.2,'b1':0.1,'b3':0.05,'b4':0.05,'c1':0.05,'c6':0.1},
                   "Thursday":  {'a1':0.25,'a3':0.05,'a4':0.3,'a5':0.05,'a6':0.1,'b1':0.05,'b4':0.05,'c2':0.1,'c4':0.05},
                   "Friday":    {'a1':0.1,'a2':0.15,'a5':0.1,'a7':0.05,'b2':0.05,'b1':0.15,'b4':0.2,'c3':0.05,'c4':0.05,'c5':0.05,'c7':0.05},
                   "Saturday":  {'a1':0.15,'a3':0.05,'b2':0.05,'b3':0.05,'b4':0.4,'c1':0.1,'c5':0.1,'c7':0.1}
                   }}
每天字典中的键都是分类的,它们有三种类型:a、b、c:每种类型都有一些子类型。a型有6个亚型,b型有4个亚型,c型有7个亚型。字典中的值表示权重(重要性)。并非每个观察(每天)都需要所有可能的子类型。应忽略每个观测值(天)中的Nan值(创建绘图时)

我想用一个离散的颜色映射来可视化这个数据,就像在这篇文章中所做的那样:。他们的解决方案非常优雅,但我的问题稍微复杂一些,因为我还想通过表示它的矩形的高度来反映每个子类型的权重(显示在y轴上)。每天的重量总和始终为一。在x轴上,我希望显示工作日。所有分配了颜色的子类型都应显示在右侧的颜色栏上,并带有相应的代码名:“a1”、“a6”、“b1”、“b4”、“c1”、“c7”

最后,我想使用不同的颜色映射为不同的子类型着色:例如,蓝色表示a型,绿色表示b型,红色表示c型

我希望使用pythonseaborn包来实现这一点,但是如果您可以建议使用不同的包来实现更好的解决方案,我不介意使用它


如果有任何建议,我将不胜感激。谢谢。

要使用seaborn创建堆叠条形图,您似乎需要将汇总条形图绘制在彼此的顶部(参见示例)。这对于18种类型来说相当复杂

有了熊猫图,事情就容易多了,尽管需要一些操作:

导入matplotlib.pyplot作为plt
作为pd进口熊猫
df=pd.DataFrame({“Sunday”):{'a1':0.1,'a2':0.15,'a4':0.05,'a6':0.1,'b2':0.05,'b4':0.2,'c1':0.15,'c4':0.15},
“星期一”:{'a2':0.05,'a3':0.15,'a5':0.25,'b1':0.05,'b3':0.1,'b4':0.1,'c3':0.1,'c5':0.05,'c7':0.15},
“星期二”:{'a1':0.2,'a3':0.15,'a6':0.05,'b2':0.35,'b3':0.05,'c1':0.1,'c4':0.1},
“星期三”:{'a2':0.05,'a3':0.05,'a4':0.35,'a6':0.2,'b1':0.1,'b3':0.05,'b4':0.05,'c1':0.05,'c6':0.1},
“星期四”:{'a1':0.25,'a3':0.05,'a4':0.3,'a5':0.05,'a6':0.1,'b1':0.05,'b4':0.05,'c2':0.1,'c4':0.05},
“星期五”:{'a1':0.1,'a2':0.15,'a5':0.1,'a7':0.05,'b2':0.05,'b1':0.15,'b4':0.2,'c3':0.05,'c4':0.05,'c7':0.05},
“星期六”:{'a1':0.15,'a3':0.05,'b2':0.05,'b3':0.05,'b4':0.4,'c1':0.1,'c5':0.1,'c7':0.1}
})
df.fillna(0,inplace=True)#将NA替换为零
df2=df.T#切换行和列
df2=df2.reindex(已排序(df2.columns),axis=1)#对列重新排序
类型=df2.0列
num_type={letter:len([t表示类型中的t,如果t[0]==letter]),表示'abc'中的字母}
df2.plot.bar(叠加=True,rot=0,figsize=(10,5),
颜色=[plt.cm.Blues_r(i/7)表示范围内的i(num_type['a'])]
+[plt.cm.Greens_r(i/7)表示范围内的i(num_type['b'])]
+[plt.cm.Reds_r(i/7)表示范围内的i(num_type['c']))
plt.图例(bbox_to_anchor=(1.02,1),loc='左上角')#主地块外的图例
plt.紧密布局()#适合图例和标签
plt.show()

PS:获取seaborn图所需的一些操作包括将索引转换为命名列(例如“type”)和将数据转换为长格式

df.fillna(0, inplace=True)
df.index = df.index.set_names(['type'])
df.reset_index(inplace=True)
types = sorted(np.unique(df['type']))
df_long = df.melt(var_name='day', value_name='weight', id_vars='type')
sns.barplot(x='day', y='weight', hue='type', hue_order=types, data=df_long)

非常感谢,这正是我需要的。太完美了!还有一个问题。。。有没有一种方法可以使项目的顺序在侧面的图形和色条中完全相同?最简单的方法是用
plt.ylim(1,0)
反转yaxis。对,这是有意义的。非常感谢。我真的很感谢你的帮助。