Matplotlib 如何创建具有边缘直方图的热图,类似于jointplot?

Matplotlib 如何创建具有边缘直方图的热图,类似于jointplot?,matplotlib,seaborn,heatmap,Matplotlib,Seaborn,Heatmap,我想绘制二维标量数据,通常使用matplotlib.pyplot.imshow或sns.heatmap来绘制。考虑这个例子: data=[[10,20,30]、[50,50,100]、[80,60,10]] 修复,ax=plt.subplot() ax.imshow(数据,cmap=plt.cm.YlGn) 现在,我还想在顶部和右侧绘制一个一维条形图,显示每列/行中的值之和-就像sns.jointplot所做的那样。然而,sns.jointplot似乎只适用于分类数据,生成直方图(使用kin

我想绘制二维标量数据,通常使用
matplotlib.pyplot.imshow
sns.heatmap
来绘制。考虑这个例子:

data=[[10,20,30]、[50,50,100]、[80,60,10]]
修复,ax=plt.subplot()
ax.imshow(数据,cmap=plt.cm.YlGn)

现在,我还想在顶部和右侧绘制一个一维条形图,显示每列/行中的值之和-就像
sns.jointplot
所做的那样。然而,
sns.jointplot
似乎只适用于分类数据,生成直方图(使用
kind='hist'
)、散点图或诸如此类-如果我想直接指定单元格的值,我不知道如何使用它。这在seaborn身上可能吗

我的绘图中的
y
轴将是天(一个月内),
x
轴将是小时。我的数据如下所示:


字段
成本差异
应构成绘图中各个字段的阴影。

这里有一种方法,首先创建一个虚拟
连接图
,然后使用其轴添加热图和总和条形图

导入matplotlib.pyplot作为plt
导入seaborn作为sns
将numpy作为np导入
作为pd进口熊猫
D=28
H=24
df=pd.DataFrame({'day':np.repeat(范围(1,D+1),H),
“小时”:np.瓦片(范围(H),D),
“成本Dif.”:np.随机.均匀(101000,D*H)})
#更改随机df以突出某些行/列(调试、检查)
df.loc[df[‘小时’]=10,‘成本Dif.]=150
df.loc[df[‘小时’]=12,‘成本Dif.]=250
df.loc[df[‘天’]=20,‘成本Dif.]=800
g=sns.jointplot(数据=df,x='day',y='hour',kind='hist',bin=(D,H))
g、 ax_marg_y.cla()
g、 ax_marg_x.cla()
sns.heatmap(data=df['Cost Dif.].to_numpy().重塑(D,H).T,ax=g.ax_关节,cbar=False,cmap='Blues')
g、 ax_marg_y.barh(np.arange(0.5,H),df.groupby(['hour'])['Cost Dif.].sum().to_numpy(),color='navy')
g、 ax_marg_x.bar(np.arange(0.5,D),df.groupby(['day'])['Cost Dif.].sum()。to_numpy(),color='navy')
g、 ax_接头套件(np.arange(0.5,D))
g、 ax_接头。设置_xticklabels(范围(1,D+1),旋转=0)
g、 ax_接头套件(np.arange(0.5,H))
g、 ax_关节。设置标签(范围(H),旋转=0)
#去除直方图和直方图之间的记号
g、 ax_marg_x.勾选参数(axis='x',bottom=False,labelbottom=False)
g、 ax_marg_y.勾选参数(axis='y',left=False,labelleft=False)
#删除显示直方图高度的记号
g、 ax_marg_x.勾选参数(axis='y',left=False,labelleft=False)
g、 ax_marg_y.勾选参数(axis='x',bottom=False,labelbottom=False)
g、 fig.set_size_inches(20,8)jointplot创建自己的图形,之后才能更改大小
#g.fig.子地块_调整(hspace=0.3)#可选地为勾号标签留出更多空间
g、 图子批次调整(hspace=0.05,wspace=0.02)#无刻度标签时所需间距较小
plt.show()

这里有一种方法,首先创建一个虚拟的
连接点
,然后使用其轴添加热图和总和条形图

导入matplotlib.pyplot作为plt
导入seaborn作为sns
将numpy作为np导入
作为pd进口熊猫
D=28
H=24
df=pd.DataFrame({'day':np.repeat(范围(1,D+1),H),
“小时”:np.瓦片(范围(H),D),
“成本Dif.”:np.随机.均匀(101000,D*H)})
#更改随机df以突出某些行/列(调试、检查)
df.loc[df[‘小时’]=10,‘成本Dif.]=150
df.loc[df[‘小时’]=12,‘成本Dif.]=250
df.loc[df[‘天’]=20,‘成本Dif.]=800
g=sns.jointplot(数据=df,x='day',y='hour',kind='hist',bin=(D,H))
g、 ax_marg_y.cla()
g、 ax_marg_x.cla()
sns.heatmap(data=df['Cost Dif.].to_numpy().重塑(D,H).T,ax=g.ax_关节,cbar=False,cmap='Blues')
g、 ax_marg_y.barh(np.arange(0.5,H),df.groupby(['hour'])['Cost Dif.].sum().to_numpy(),color='navy')
g、 ax_marg_x.bar(np.arange(0.5,D),df.groupby(['day'])['Cost Dif.].sum()。to_numpy(),color='navy')
g、 ax_接头套件(np.arange(0.5,D))
g、 ax_接头。设置_xticklabels(范围(1,D+1),旋转=0)
g、 ax_接头套件(np.arange(0.5,H))
g、 ax_关节。设置标签(范围(H),旋转=0)
#去除直方图和直方图之间的记号
g、 ax_marg_x.勾选参数(axis='x',bottom=False,labelbottom=False)
g、 ax_marg_y.勾选参数(axis='y',left=False,labelleft=False)
#删除显示直方图高度的记号
g、 ax_marg_x.勾选参数(axis='y',left=False,labelleft=False)
g、 ax_marg_y.勾选参数(axis='x',bottom=False,labelbottom=False)
g、 fig.set_size_inches(20,8)jointplot创建自己的图形,之后才能更改大小
#g.fig.子地块_调整(hspace=0.3)#可选地为勾号标签留出更多空间
g、 图子批次调整(hspace=0.05,wspace=0.02)#无刻度标签时所需间距较小
plt.show()

非常有效,谢谢。还有一个问题:我只希望在大热图上有刻度,而不是在侧面/顶部的条形图上。我试着在绘图的各个部分调用
.set_ticks([])
g.ax_marg_x
g.ax_marg_y
),但我只能设法关闭所有的刻度。
g.ax_marg_x.tick_参数(axis='x',bottom False,labelbottom=False)
g.ax_marg.tick_.tick_参数(axis='y',left=False)
删除热图和直方图之间的标签。对
ax_marg_x
ax_marg_y
反向执行同样的操作也会删除指示高度的记号。我更新了答案以删除边缘图上的记号。现在有空间删除子地块之间的一些空白。工作起来很有魅力,谢谢。还有一个问题:我只希望在大热图上有刻度,而不是在侧面/顶部的条形图上。我试着调用
。在绘图的各个部分(
g.ax\u marg\u x
g.ax)设置刻度([])
_