2

我有一个热图,我想要一个刻度,它的值高于表示的最大刻度。
像这样的东西:

这个.

我尝试添加刻度和刻度标签:

yticks_i_want = np.append(ax.get_yticks(), 2600)
ax.set_yticks(yticks_i_want)

但是,会发生这种情况:

这个

到目前为止,我发现的最佳解决方案是使用ax.text(),如下所示:

ax.text(-0.059, 2600, '2600 -', transform=ax.get_yaxis_transform(),
            ha='center', va='top')

我错过了什么吗?
是否有另一种添加刻度的方法,或者我必须“剪切”图 2以仅显示我想要的值?

4

1 回答 1

1

问题是ax.get_yticks()返回超出轴限制的刻度,在这种情况下:

In [6]: ax.get_yticks()
Out[6]: array([1.e-01, 1.e+00, 1.e+01, 1.e+02, 1.e+03, 1.e+04, 1.e+05])

这就是为什么当您在附加自定义值后设置新刻度时,y 轴限制会发生变化。

选项 1:排除当前轴限制之外的刻度

我们可以通过一个简单的列表推导来解决这个问题,以排除当前ylim. 例如:

yticks_i_want = [y for y in ax.get_yticks() if (y >= ax.get_ylim()[0] and y <= ax.get_ylim()[1])]
yticks_i_want.append(2600.)

把它放在一个最小的例子中:

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

fig, ax = plt.subplots()
ax.set_yscale('log')
ax.set_ylim(1, 3000)

yticks_i_want = [y for y in ax.get_yticks() if (y >= ax.get_ylim()[0] and y <= ax.get_ylim()[1])]
yticks_i_want.append(2600.)

ax.set_yticks(yticks_i_want)

ax.yaxis.set_major_formatter(ticker.ScalarFormatter())

plt.show()

(注意ScalarFormatter())只是为了让刻度标签格式与问题中的格式相匹配,而不是使用科学风格)。

在此处输入图像描述

选项 2:添加刻度后重置轴限制

当然,一个简单的替代方法是在添加自定义刻度位置后再次设置轴限制:

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

fig, ax = plt.subplots()
ax.set_yscale('log')
ax.set_ylim(1, 3000)

ylim = ax.get_ylim()
yticks_i_want = np.append(ax.get_yticks(), 2600)
ax.set_yticks(yticks_i_want)

ax.set_ylim(*ylim)

ax.yaxis.set_major_formatter(ticker.ScalarFormatter())

plt.show()
于 2020-11-24T12:17:32.860 回答