我有一个包含多个特征及其相关 t 检验结果和 p 值的 DataFrame。我的目标是使用 Seaborn 在 Python 中生成组合热图。在此热图中,一个部分应使用 z 分数显示具有标准化数据的特征(以确保高值和低值的可见性),而另一部分应显示原始 t 检验值和 p 值。
我打算为每个部分创建一个具有不同配色方案的热图,以清楚地区分它们。然而,我尝试绘制两个单独的热图并将它们组合起来,结果得到了单独的图,而不是统一的热图。
有人可以指导我如何创建两个部分都附加在一起的单个组合热图吗?
这是我到目前为止尝试过的代码: import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt from matplotlib import gridspec
# Example DataFrame
data = {
'Feature1': np.random.randn(10),
'Feature2': np.random.randn(10),
'Feature3': np.random.randn(10),
't test': np.random.randn(10),
'p value': np.random.rand(10)
}
df = pd.DataFrame(data)
# Drop the last two columns
df_heatmap = df.iloc[:, :-2]
# Calculate z-scores for the DataFrame
df_heatmap_zscore = (df_heatmap - df_heatmap.mean()) / df_heatmap.std()
# Set up the layout
fig = plt.figure(figsize=(12, 8))
gs = gridspec.GridSpec(1, 4, width_ratios=[1, 1, 0.05, 0.05]) # 4 columns: 2 for heatmaps, 2 for colorbars
# Heatmap for the DataFrame excluding t-test and p-value columns
ax1 = plt.subplot(gs[0])
sns.heatmap(df_heatmap_zscore, cmap='coolwarm', annot=True, cbar=False)
plt.title('Heatmap without t-test and p-value')
# Heatmap for t-test p-values
ax2 = plt.subplot(gs[1])
sns.heatmap(df[['t test', 'p value']], cmap='viridis', annot=True, fmt=".4f", cbar=False, ax=ax2)
plt.title('Heatmap for t-test p-values')
# Create a single colorbar for the z-score
cbar_ax1 = plt.subplot(gs[2])
cbar1 = plt.colorbar(ax1.collections[0], cax=cbar_ax1, orientation='vertical')
cbar1.set_label('Z-score')
# Create a single colorbar for the t-test p-values
cbar_ax2 = plt.subplot(gs[3])
cbar2 = plt.colorbar(ax2.collections[0], cax=cbar_ax2, orientation='vertical')
cbar2.set_label('p-value')
plt.tight_layout()
plt.show()
有没有办法将这些热图组合成一个图,使它们看起来是附加的并具有不同的颜色图案和图例栏?
对于下图,我使用
fig.add_axes
(而不是gridspec
)按顺序添加每个轴,因为我更熟悉该方法。