如何在 seaborn 热图标签中使用科学记数法?

Posted

技术标签:

【中文标题】如何在 seaborn 热图标签中使用科学记数法?【英文标题】:How to use scientific notation in seaborn heatmap labels? 【发布时间】:2018-05-23 15:39:18 【问题描述】:

我正在尝试在 python 中使用 seaborn 获取热图。不幸的是,即使数字非常大,它也没有使用科学计数法。我想知道是否有任何简单的方法可以转换为科学记数法或任何其他合理的格式。这是一段显示问题的代码:

import seaborn as sns 
import numpy as np
C_vals = np.logspace(3, 10, 8)
g_vals = np.logspace(-6, 2, 9)
score = np.random.rand(len(g_vals), len(C_vals))
sns.heatmap(score, xticklabels=C_vals, yticklabels=g_vals)

结果图如下

【问题讨论】:

【参考方案1】:

热图允许从xticklabels/yticklabels 命令的输入创建其标签。然后将它们放在轴上,因此没有数字格式可以改变它们的外观。

一个选项是在将标签提供给热图之前对其进行格式化。为此,可以(误)使用 matplotlib ScalarFormatter,它允许从浮点数自动生成 MathText 字符串。下面是一个例子:

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import seaborn as sns 
import numpy as np

C_vals = np.logspace(3, 10, 8)
g_vals = np.logspace(-6, 2, 9)
score = np.random.rand(len(g_vals),len(C_vals))

tick = ticker.ScalarFormatter(useOffset=False, useMathText=True)
tick.set_powerlimits((0,0))

tc = [u"$$".format(tick.format_data(x)) for x in C_vals]
tg = [u"$$".format(tick.format_data(x)) for x in g_vals]

sns.heatmap(score, xticklabels=tc, yticklabels=tg)

plt.show()

【讨论】:

漂亮,正是我想要的!【参考方案2】:

如果您可以忍受不使用sns.heatmap,那么使用pcolormesh 可能更自然

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import numpy as np

C_vals = np.logspace(3, 10, 8)
g_vals = np.logspace(-6, 2, 9)
score = np.random.rand(len(g_vals),len(C_vals))

fig, ax = plt.subplots()

ax.pcolormesh(C_vals, g_vals, score)
ax.set_yscale('log')
ax.set_xscale('log')
plt.show()

如下所述,pcolormesh 的居中方式不同。此外,它实际上下降了一个级别。虽然我有一个 PR 来改变这种行为,但这里有一个解决方法。我承认在这一点上,它并不比使用heatmap 输出更优雅。

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import numpy as np

C_vals = np.logspace(3, 10, 8)
g_vals = np.logspace(-6, 2, 9)
# make bracketing:
def midpointext(x):
    return np.hstack(( 1.5 * x[0] - 0.5 * x[1],
            x[:-1] + 0.5 * np.diff(x),
            1.5 * x[-1] - 0.5 * x[-2]))
newC = np.log10(C_vals)
newC = midpointext(newC)
newC = 10**newC
newg = np.log10(g_vals)
newg = midpointext(newg)
newg = 10**newg
score = np.random.rand(len(g_vals),len(C_vals))
fig, ax = plt.subplots()

ax.pcolormesh(newC, newg, score)
ax.set_yscale('log')
ax.set_xscale('log')
plt.show()

【讨论】:

这很好,只是不清楚每个标签对应的矩形。是右边还是左边?

以上是关于如何在 seaborn 热图标签中使用科学记数法?的主要内容,如果未能解决你的问题,请参考以下文章

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

seaborn 热图的人工刻度标签

热图中的日期轴 seaborn

自定义注释 Seaborn 热图

Seaborn 热图未显示所有 xticks 和 yticks

seaborn 热图显示轴标签,但当 df.corr 为 NaN 时没有值