Seaborn 热图在热图可视化的所有轴上都有列名,而不仅仅是默认的 x 和 y 轴
Seaborn Heatmap with column names on all axes of heatmap visualization instead of on just default x and y axes
我有一些大的热图,我想在 top/right 轴和 seaborn 热图功能已经启用的默认轴上使用列名生成。
我目前的尝试如下。注意——当前代码是使用示例随机数据完成的。
size = len(data.columns)
f,ax = plt.subplots(figsize=(size, size))
sns.heatmap(data.corr().abs(), annot=True, linewidths=.5, fmt= '.2f',ax=ax)
ax3 = ax.twiny()
ax3.set_aspect("equal")
print(ax.get_xlim())
ax3.set_xlim([0,ax.get_xlim()[1]])
ax3.set_xticks(ax.get_xticks())
ax3.set_xticklabels(data.columns.tolist())
ax3.tick_params(top=True)
ax3.spines['top'].set_visible(False)
ax3.spines['right'].set_visible(False)
ax3.spines['bottom'].set_visible(False)
ax3.spines['left'].set_visible(False)
这会产生以下结果:
如果您查看顶部轴,会发现存在具有相似标签的刻度。但是,您会看到刻度线位置发生了变化。我想知道是否有办法做到这一点,使其与底轴完全匹配。我认为代码应该类似于在右轴上重复 y 轴。
可以添加两个带有正确标签的附加轴。为了获得好看的输出,我建议将颜色条移动到图下方,因为 y 轴刻度和颜色条将绘制在同一区域,这不太好看。
import seaborn as sns
import matplotlib.pyplot as plt
data = pd.DataFrame({'col1':range(10), 'col2':range(10, 20), })
size = len(data.columns)
f,ax = plt.subplots(figsize=(size, size))
sns.heatmap(data.corr().abs(), annot=True, linewidths=.5, fmt= '.2f',ax=ax, cbar_kws={'orientation': 'horizontal'})
#ax3.set_aspect("equal")
ax3 = ax.twiny()
ax3.set_xlim([0, ax.get_xlim()[1]])
ax3.set_xticks(ax.get_xticks())
ax3.set_xticklabels(data.columns.tolist())
ax4 = ax.twinx()
ax4.set_ylim([ax.get_ylim()[0],0])
ax4.set_yticks(ax.get_yticks())
ax4.set_yticklabels(data.columns.tolist())
输出
评论你的旧代码
我正在使用您共享的代码创建一个最小示例,我发现没有行 ax3.set_aspect("equal")
输出看起来更好。
示例代码
import seaborn as sns
import matplotlib.pyplot as plt
data = pd.DataFrame({'col1':range(10), 'col2':range(10, 20), })
size = len(data.columns)
f,ax = plt.subplots(figsize=(size, size))
sns.heatmap(data.corr().abs(), annot=True, linewidths=.5, fmt= '.2f',ax=ax)
ax3 = ax.twiny()
# ax3.set_aspect("equal") <-- this line was causing some problems
ax3.set_xlim([0,ax.get_xlim()[1]])
ax3.set_xticks(ax.get_xticks())
ax3.set_xticklabels(data.columns.tolist())
Output with the line
Output without the line
我有一些大的热图,我想在 top/right 轴和 seaborn 热图功能已经启用的默认轴上使用列名生成。
我目前的尝试如下。注意——当前代码是使用示例随机数据完成的。
size = len(data.columns)
f,ax = plt.subplots(figsize=(size, size))
sns.heatmap(data.corr().abs(), annot=True, linewidths=.5, fmt= '.2f',ax=ax)
ax3 = ax.twiny()
ax3.set_aspect("equal")
print(ax.get_xlim())
ax3.set_xlim([0,ax.get_xlim()[1]])
ax3.set_xticks(ax.get_xticks())
ax3.set_xticklabels(data.columns.tolist())
ax3.tick_params(top=True)
ax3.spines['top'].set_visible(False)
ax3.spines['right'].set_visible(False)
ax3.spines['bottom'].set_visible(False)
ax3.spines['left'].set_visible(False)
这会产生以下结果:
如果您查看顶部轴,会发现存在具有相似标签的刻度。但是,您会看到刻度线位置发生了变化。我想知道是否有办法做到这一点,使其与底轴完全匹配。我认为代码应该类似于在右轴上重复 y 轴。
可以添加两个带有正确标签的附加轴。为了获得好看的输出,我建议将颜色条移动到图下方,因为 y 轴刻度和颜色条将绘制在同一区域,这不太好看。
import seaborn as sns
import matplotlib.pyplot as plt
data = pd.DataFrame({'col1':range(10), 'col2':range(10, 20), })
size = len(data.columns)
f,ax = plt.subplots(figsize=(size, size))
sns.heatmap(data.corr().abs(), annot=True, linewidths=.5, fmt= '.2f',ax=ax, cbar_kws={'orientation': 'horizontal'})
#ax3.set_aspect("equal")
ax3 = ax.twiny()
ax3.set_xlim([0, ax.get_xlim()[1]])
ax3.set_xticks(ax.get_xticks())
ax3.set_xticklabels(data.columns.tolist())
ax4 = ax.twinx()
ax4.set_ylim([ax.get_ylim()[0],0])
ax4.set_yticks(ax.get_yticks())
ax4.set_yticklabels(data.columns.tolist())
输出
评论你的旧代码
我正在使用您共享的代码创建一个最小示例,我发现没有行 ax3.set_aspect("equal")
输出看起来更好。
示例代码
import seaborn as sns
import matplotlib.pyplot as plt
data = pd.DataFrame({'col1':range(10), 'col2':range(10, 20), })
size = len(data.columns)
f,ax = plt.subplots(figsize=(size, size))
sns.heatmap(data.corr().abs(), annot=True, linewidths=.5, fmt= '.2f',ax=ax)
ax3 = ax.twiny()
# ax3.set_aspect("equal") <-- this line was causing some problems
ax3.set_xlim([0,ax.get_xlim()[1]])
ax3.set_xticks(ax.get_xticks())
ax3.set_xticklabels(data.columns.tolist())
Output with the line | Output without the line |
---|---|