seaborn 热图的人工刻度标签

Posted

技术标签:

【中文标题】seaborn 热图的人工刻度标签【英文标题】:Artificial tick labels for seaborn heatmaps 【发布时间】:2017-04-05 16:25:57 【问题描述】:

我有一个如下所示的 seaborn 热图:

...从随机生成的值的 pandas 数据帧生成,其中一部分如下所示:

y 轴上的值都在 [0,1] 范围内,x 轴上的值都在 [0,2*pi] 范围内,我只想要一些固定间隔的短浮点数勾选标签,但我似乎只能获取数据框中的值。当我尝试指定我想要的值时,它并没有将它们放在正确的位置,如上图所示。他现在是我的代号。如何在正确的位置(沿轴均匀分布)获取我尝试在此代码中使用 xticks 和 yticks 指定的轴标签?

import pandas as pd
import numpy as np
import matplotlib as plt
from matplotlib.mlab import griddata

sns.set_style("darkgrid")
PHI, COSTH = np.meshgrid(phis, cos_thetas)
THICK = griddata(phis, cos_thetas, thicknesses, PHI, COSTH, interp='linear')

thick_df = pd.DataFrame(THICK, columns=phis, index=cos_thetas)
thick_df = thick_df.sort_index(axis=0, ascending=False)
thick_df = thick_df.sort_index(axis=1)

cmap = sns.cubehelix_palette(start=1.6, light=0.8, as_cmap=True, reverse=True)

yticks = np.array([0,0.2,0.4,0.6,0.8,1.0])

xticks = np.array([0,1,2,3,4,5,6])

g = sns.heatmap(thick_df, linewidth=0, xticklabels=xticks, yticklabels=yticks, square=True, cmap=cmap)

plt.show(g)

【问题讨论】:

请注意,我也单独尝试了 xticks = [str(x) if i % 10 == 0 else '' for i,x in enumerate(xticks)] 的行,但值仍然很长,随机浮动。 如果你只想要例如每五个字段都有一个刻度标签,您可以尝试在每个值之间创建一个包含四个空字符串的数组。您的刻度数组需要与热图的行/列一样多的元素是有道理的。另外我会使用字符串而不是数字。 但这就是我上面的评论所完成的,问题是每五个值或任何值仍然是一个很长的、讨厌的浮点数。你的意思是用它来指定一个位置,然后在那里放一个单独的字符串值吗?我可以这样做吗? 抱歉,没有正确阅读。而不是 str(x) 试试这个:':.2f'.format(x) 用于具有 2 个小数位的浮点数。 以上代码中的phiscos_thetasthicknesses 是什么? 【参考方案1】:

这里应该做你想做的事情:

cmap = sns.cubehelix_palette(start=1.6, light=0.8, as_cmap=True, reverse=True)

yticks = np.linspace(0,1,6)

x_end = 6
xticks = np.arange(x_end+1)

ax = sns.heatmap(thick_df, linewidth=0, xticklabels=xticks, yticklabels=yticks[::-1], square=True, cmap=cmap)

ax.set_xticks(xticks*ax.get_xlim()[1]/(2*math.pi))
ax.set_yticks(yticks*ax.get_ylim()[1])

plt.show()

您可以通过 [':,.2f'.format(x) for x in xticks] 而不是 xticks 来获得带有 2 位小数的浮点数。

请注意,我正在反转 yticklabels,因为这是 seaborn 所做的:请参阅 matrix.py#L138。

Seaborn 计算同一地点周围的刻度位置(例如:#L148),对您而言,这相当于:

# thick_df.T.shape[0] = thick_df.shape[1]
xticks: np.arange(0, thick_df.T.shape[0], 1) + .5
yticks: np.arange(0, thick_df.T.shape[1], 1) + .5

【讨论】:

以上是关于seaborn 热图的人工刻度标签的主要内容,如果未能解决你的问题,请参考以下文章

更改 seaborn 热图颜色条上的刻度大小

使用 Seaborn 和 Matplotlib 在热图和线图的共享子图中对齐 x 轴刻度

在 Seaborn 热图中保留一些刻度

如何修复 matplotlib 和 seaborn 热图?

更改seaborn热图的轴标签[重复]

Seaborn热图顶行和底行被部分截断[重复]