matplotlib 在海运中组合两个热图

xbp102n0  于 2023-04-21  发布在  其他
关注(0)|答案(3)|浏览(147)

我有两个维度为4x25的数据表,每个表都来自不同的时间点,但具有完全相同的 meta数据,本质上是相同的列和行标题。
考虑到大量的列,我认为最好使用heatmap使用Pythonseaborn库来表示。然而,我需要在同一个图中包含两个表。我可以创建一个单独的热图来表示一个单独的数据表。

df = pd.DataFrame(raw_data)
ax = sns.heatmap(df)
ax.set(yticklabels=labels)

然而,我不确定如何将两个数据表合并到同一个热图中。我能想到的唯一方法是创建一个新的DataFrame维度4x50,然后将两个表放入其中,并使用热图绘制。但是,我需要帮助解决以下问题:
1.我不知道如何在热图的中间画一条线来区分两个表中的数据。
1.另一种解决方案是为同一热图内的2组数据应用2种不同的着色方案,而不是简单地在中间画一条线。

5q4ezhmt

5q4ezhmt1#

在图中并排显示两个海运热图的一种可能方法是将它们绘制到单独的子图中。可以将子图之间的空间设置为非常小(wspace=0.01),并将相应的颜色条和标签放置在该间隙之外。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns

df =  pd.DataFrame(np.random.rand(25,4), columns=list("ABCD"))
df2 = pd.DataFrame(np.random.rand(25,4), columns=list("WXYZ"))

fig, (ax,ax2) = plt.subplots(ncols=2)
fig.subplots_adjust(wspace=0.01)
sns.heatmap(df, cmap="rocket", ax=ax, cbar=False)
fig.colorbar(ax.collections[0], ax=ax,location="left", use_gridspec=False, pad=0.2)
sns.heatmap(df2, cmap="icefire", ax=ax2, cbar=False)
fig.colorbar(ax2.collections[0], ax=ax2,location="right", use_gridspec=False, pad=0.2)
ax2.yaxis.tick_right()
ax2.tick_params(rotation=0)
plt.show()

eanckbw9

eanckbw92#

matplotlib/seaborn库最好的部分是,所有内容都在同一个图中绘制,直到你清除它。你可以使用sns.heatmap中的mask参数来获得对角线热图。要获得“混合”热图,这样你就可以用不同的颜色Map绘制两种不同类型的数据,你可以这样做:

from sklearn.datasets import load_iris
import seaborn as sns
import pandas as pd
import numpy as np

data = load_iris()
df= pd.DataFrame(data.data,columns = data.feature_names)
df['target'] = data.target

df_0 = df[df['target']==0]
df_1 = df[df['target']==1]

df_0.drop('target',axis=1,inplace=True)
df_1.drop('target',axis=1,inplace=True)

matrix_0 = np.triu(df_0.corr())
matrix_1 = np.tril(df_1.corr())

import seaborn as sns
from mpl_toolkits.axes_grid1.axes_divider import make_axes_locatable
from mpl_toolkits.axes_grid1.colorbar import colorbar
sns.heatmap(df_0.corr(),annot=True,mask=matrix_0,cmap="BuPu")
sns.heatmap(df_1.corr(),annot=True,mask=matrix_1,cmap="YlGnBu")

希望这就是你的第二个想法。注意,这只会在你有相同的列名时起作用。

zkure5ic

zkure5ic3#

Quark的答案的一个轻微的扭曲,以避免矩阵中的0值,这将导致这些值显示后面的cmap。我们可以计算布尔矩阵来掩盖上/下三角形。More info here。还添加了cbars的限制来固定比例。

from sklearn.datasets import load_iris
import seaborn as sns
import pandas as pd
import numpy as np

data = load_iris()
df= pd.DataFrame(data.data,columns = data.feature_names)
df['target'] = data.target

df_0 = df[df['target']==0]
df_1 = df[df['target']==1]

df_0.drop('target',axis=1,inplace=True)
df_1.drop('target',axis=1,inplace=True)

mask_0 = np.zeros_like(df_0.corr(), dtype=np.bool_)
mask_0[np.tril_indices_from(mask_0)] = True
mask_1 = mask_0.T

import seaborn as sns
from mpl_toolkits.axes_grid1.axes_divider import make_axes_locatable
from mpl_toolkits.axes_grid1.colorbar import colorbar
sns.heatmap(df_0.corr(), annot=True, mask=mask_0, cmap="Blues", vmin=0, vmax=1)
sns.heatmap(df_1.corr(), annot=True, mask=mask_1, cmap="Greens", vmin=0, vmax=1)

2

相关问题