Python 根据标签,创建热图并在其顶部绘制三条不同的线

Python 根据标签,创建热图并在其顶部绘制三条不同的线,python,matplotlib,seaborn,heatmap,line-plot,Python,Matplotlib,Seaborn,Heatmap,Line Plot,我有以下数据帧: val1=np.random.rand(234) val2=np.random.rand(234) val3=np.random.rand(234) wave=np.arange(start=300, stop=1000, step=3) labels=['label1','label2','label3'] df=pd.DataFrame([val1,val2,val3],columns=wave) df['labels']=['label1','label2','labe

我有以下数据帧:

val1=np.random.rand(234)
val2=np.random.rand(234)
val3=np.random.rand(234)
wave=np.arange(start=300, stop=1000, step=3)
labels=['label1','label2','label3']

df=pd.DataFrame([val1,val2,val3],columns=wave)
df['labels']=['label1','label2','label3']
df=df.set_index('labels')

以及以下一行:

line=np.random.uniform(low=-1.5, high=1.5, size=(234,))
line_df=pd.DataFrame([wave,line]).T
line_df.columns=['wave','val']
我想用标签创建热图,并在每个标签行中绘制线,作为次轴,如下所示:

我在热图上画了一条线(理论上假设是同一条线)

我可以用这种方式创建热图,但不能按标签画线:

import matplotlib.pyplot as plt
import seaborn as sns
sns.set(rc={'figure.figsize':(25,8.7)},font_scale = 2)
ax =sns.heatmap(df,cmap='Reds').set(title='heatmap')

ax2=plt.twinx()
ax2.plot(line_df['wave'], line_df['val'],color="blue",linewidth=3)

正在寻找为每个y标签添加相同线条的想法。

这里是一种创建3个堆叠子地块的方法。单独的子地块允许3条曲线的单独y轴

导入matplotlib.pyplot作为plt
从matplotlib.cm导入ScalarMapable
导入seaborn作为sns
作为pd进口熊猫
将numpy作为np导入
val1=np.random.rand(234)
val2=np.random.rand(234)
val3=np.random.rand(234)
波=np.arange(开始=300,停止=1000,步进=3)
标签=['label1'、'label2'、'label3']
df=pd.DataFrame([val1,val2,val3],columns=wave)
df['labels']=['label1','label2','label3']
df=df.set_索引(“标签”)
line=np.random.uniform(低=1.5,高=1.5,大小=(234,)
line_df=pd.DataFrame([wave,line]).T
行_df.columns=['wave','val']
sns.set(rc={'figure.figsize':(25,8.7)},font_scale=2)
图,axs=plt.subplot(nrows=3,sharex=True,gridspec_kw={'hspace':0})
norm=plt.Normalize(df.to_numpy().min(),df.to_numpy().max())
cmap=‘红色’
对于i,枚举中的ax(axs):
ax.imshow(df.iloc[i:i+1,:]to_numpy(),区段=[wave[0],wave[-1],0,1],aspect='auto',cmap=cmap,norm=norm)
ax.set_yticks([0.5])
ax.set_yticklabels([df.index[i]]))
如果ax==axs[1]:
ax.set_ylabel('标签')
ax2=ax.twinx()
ax2.绘图(线条方向['wave',线条方向['val',color=“blue”,线宽=3)
ax.grid(假)
ax2.网格(错误)
axs[0]。设置标题(“热图”)
plt.colorbar(ScalarMappable(cmap=cmap,norm=norm),ax=axs)
plt.子批次调整(左=0.12,右=0.72)
plt.show()

以下是创建3个堆叠子地块的方法。单独的子地块允许3条曲线的单独y轴

导入matplotlib.pyplot作为plt
从matplotlib.cm导入ScalarMapable
导入seaborn作为sns
作为pd进口熊猫
将numpy作为np导入
val1=np.random.rand(234)
val2=np.random.rand(234)
val3=np.random.rand(234)
波=np.arange(开始=300,停止=1000,步进=3)
标签=['label1'、'label2'、'label3']
df=pd.DataFrame([val1,val2,val3],columns=wave)
df['labels']=['label1','label2','label3']
df=df.set_索引(“标签”)
line=np.random.uniform(低=1.5,高=1.5,大小=(234,)
line_df=pd.DataFrame([wave,line]).T
行_df.columns=['wave','val']
sns.set(rc={'figure.figsize':(25,8.7)},font_scale=2)
图,axs=plt.subplot(nrows=3,sharex=True,gridspec_kw={'hspace':0})
norm=plt.Normalize(df.to_numpy().min(),df.to_numpy().max())
cmap=‘红色’
对于i,枚举中的ax(axs):
ax.imshow(df.iloc[i:i+1,:]to_numpy(),区段=[wave[0],wave[-1],0,1],aspect='auto',cmap=cmap,norm=norm)
ax.set_yticks([0.5])
ax.set_yticklabels([df.index[i]]))
如果ax==axs[1]:
ax.set_ylabel('标签')
ax2=ax.twinx()
ax2.绘图(线条方向['wave',线条方向['val',color=“blue”,线宽=3)
ax.grid(假)
ax2.网格(错误)
axs[0]。设置标题(“热图”)
plt.colorbar(ScalarMappable(cmap=cmap,norm=norm),ax=axs)
plt.子批次调整(左=0.12,右=0.72)
plt.show()

一个想法是创建3个子地块,共享x,子地块之间的距离为零。这样,您可以在右侧有3个不同的y轴。(还要注意,
ax=sns.heatmap(df,cmap='Reds').set(title='heatmap')
使
ax
None
。您需要
ax=sns.heatmap(df,cmap='Reds')
然后
ax.set(title='heatmap')
)创建三个子地块,它们之间共享x和零距离。这样,您可以在右侧有3个不同的y轴。(还要注意,
ax=sns.heatmap(df,cmap='Reds').set(title='heatmap')
使
ax
。您需要
ax=sns.heatmap(df,cmap='Reds')
然后
ax.set(title='heatmap')