Eu tenho um DataFrame contendo vários recursos junto com seus resultados de teste t e valores p associados. Meu objetivo é gerar um mapa de calor combinado em Python usando Seaborn. Neste mapa de calor, uma seção deve exibir os recursos com dados normalizados usando pontuações z (para garantir a visibilidade dos valores altos e baixos), enquanto a outra seção deve apresentar os valores originais do teste t e valores p.
Pretendo criar um único mapa de calor com esquemas de cores distintos para cada seção para diferenciá-las claramente. No entanto, minhas tentativas de traçar dois mapas de calor separados e combiná-los resultaram em gráficos separados, em vez de um mapa de calor unificado.
Alguém poderia me orientar sobre como criar um único mapa de calor combinado onde ambas as seções aparecem anexadas?
Aqui está o código que tentei até agora: 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()
Existe uma maneira de combinar esses mapas de calor em um único gráfico, para que apareçam anexados e tenham padrões de cores e barras de legenda diferentes?
Para a figura abaixo, adicionei cada eixo em sequência usando
fig.add_axes
(em vez degridspec
), pois estou mais familiarizado com esse método.