如何给x轴的刻度添加动画效果?

5 投票
1 回答
5405 浏览
提问于 2025-04-16 19:17

我在一个 matplotlibaxes 实例里,正在通过 blit 技术来做动画,里面有一个 AxesImage

我想要做的事情是,让 x 轴上的刻度也动起来。现在我在不断更新 AxesImage 的数据,并且频繁地重新绘制它。每次更新时,我想要移动一个额外的刻度,以突出显示某个位置。现在我正在这样做:

axis = axes.get_xaxis
im.set_data(new_data)
axis.set_ticks([10,20,30,x,t])
axis.set_ticklabels(["p", "u", "z", "z", "i"])
axes.draw_artist(im)
axes.draw_artist(axis)

虽然我看到刻度在正确更新,但刻度的标签却没有更新。我觉得坐标轴的边界框(bbox)可能没有包含坐标轴,这种情况可能吗?如果是的话,我该怎么做动画?我需要从其他地方复制并恢复吗?

1 个回答

4

坐标轴的边框(bbox)只包括坐标轴内部的内容,比如不包括刻度标签、标题等。

解决这个问题的一个简单方法是,在进行图像更新时,直接抓取整个图形区域。(比如可以用 background = canvas.copy_from_bbox(fig.bbox)

不过如果你有多个子图,只想动画其中一个,那就可能会遇到问题。在这种情况下,可以尝试用 background = canvas.copy_from_bbox(ax.bbox.expanded(1.1, 1.2)) 这样的方式。你需要大致估算一下需要的比例。

如果你需要刻度标签的确切范围,那就稍微复杂一些。最简单的方法是遍历刻度标签对象,然后和 ax.bbox 进行合并。你可以把这个操作写成一行代码: ax.bbox.union([label.get_window_extent() for label in ax.get_xticklabels()])

总之,这三种方法中的任何一种应该都能满足你的需求。

撰写回答