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

时间:2015-09-27 21:25:20

标签: python matplotlib plot

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

unboxed_ticklabel_multifig

我想在其中一个标签周围画一个小红框,如下:

boxed_ticklabel_multifig

如何在Matplotlib中做到这一点(可靠且可重复)?

1 个答案:

答案 0 :(得分:3)

最简单的案例:静态情节

对于静态情节,它很简单:

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()

enter image description here

(请注意,如果要更改填充,圆角,形状等,可以通过多种方式配置标签周围的框。annotation guide有一些示例。请查看bboxboxstyle例子。)

跟上互动变化

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

平移: enter image description here

缩放: enter image description here

要完全重复这样做,无论您如何以交互方式缩放和填充,它都会保持在那里,您需要将回调连接到绘图事件。

使用注释而不是Ticklabels

然而,无论如何,这种方式更适合您的目的。

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

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

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()

enter image description here

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

enter image description here

但更常见的是,您可以使用它来放置或注释某些特定值。例如:

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()

enter image description here

请注意,无论我们如何缩放或平移,它都将保持在x轴上的2000位置,并且无论是否存在ticklabel,它都将存在。