在 Matplotlib 中在刻度标签周围绘制框

tel*_*tel 3 python plot matplotlib

我有一个带有多个子图的 Matplotlib 图:

unboxed_ticklabel_multifig

我想在其中一个刻度标签周围画一个红色的小框,如下所示:

boxed_ticklabel_multifig

我怎样才能在 Matplotlib 中做到这一点(可靠且可重复)?

Joe*_*ton 5

最简单的情况:静态图

对于静态图,很简单:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.axis([0, 2000, 0, 2e-9])

label = ax.xaxis.get_ticklabels()[-1]
label.set_bbox(dict(facecolor='none', edgecolor='red'))

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

(请注意,如果要更改填充、四舍五入、形状等,可以通过多种方式配置标签周围的框。注释指南有一些示例。请查看bboxboxstyle示例。)


跟上交互式变化

但是,如果我们以交互方式缩放或平移,带有红色边框的刻度标签不一定是 2000。(相反,它将基于索引。)

平移: 在此处输入图片说明

缩放: 在此处输入图片说明

要完全可重复地执行此操作,无论您如何交互缩放和填充,它都会留在那里,您需要将回调连接到绘制事件。


使用注释代替刻度标签

但是,无论如何,有一种更简单的方法可能更适合您的目的。

与其将其设置为刻度标签,不如使用注释来绘制它。这样,无论刻度是如何绘制的,您将始终拥有指定值的标签。

作为一个非常hackish的例子(通常,你可能会在下面放置一个文本标签......):

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.axis([0, 2000, 0, 2e-9])

ax.annotate('_____', xy=(2000, 0), xytext=(0, -ax.xaxis.labelpad),
            xycoords=('data', 'axes fraction'), textcoords='offset points',
            ha='center', va='top',
            bbox=dict(boxstyle='round', fc='none', ec='red'))

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

无论我们如何缩放或平移,它都会在 x 轴上保持在 2000(尽管它不能保证在 2000 处会有刻度或刻度标签):

在此处输入图片说明

但是,更多情况下,您会使用它来放置或注释某些特定值。例如:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.axis([0, 2000, 0, 2e-9])

ax.annotate('Cutoff', xy=(2000, 0), xytext=(0, -15 - ax.xaxis.labelpad),
            xycoords=('data', 'axes fraction'), textcoords='offset points',
            ha='center', va='top',
            bbox=dict(boxstyle='round', fc='none', ec='red'))

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

请注意,无论我们如何缩放或平移,这也将保持在 x 轴上的 a 位置 2000,并且无论刻度标签是否在那里,它都会在那里。