Skip to main content
 首页 » 编程设计

python之如何使用 matplotlib 使绘图的 xtick 标签成为简单的绘图

2025年05月04日10luoye11

我不想用文字或数字作为 x 轴的刻度标签,而是想绘制一个简单的图形(由直线和圆圈组成)作为每个 x 刻度的标签。这可能吗?如果是这样,在 matplotlib 中实现它的最佳方法是什么?

请您参考如下方法:

我会删除刻度标签并将文本替换为 patches .以下是执行此任务的简要示例:

import matplotlib.pyplot as plt 
import matplotlib.patches as patches 
 
 
# define where to put symbols vertically 
TICKYPOS = -.6 
 
fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.plot(range(10)) 
 
# set ticks where your images will be 
ax.get_xaxis().set_ticks([2,4,6,8]) 
# remove tick labels 
ax.get_xaxis().set_ticklabels([]) 
 
 
# add a series of patches to serve as tick labels 
ax.add_patch(patches.Circle((2,TICKYPOS),radius=.2, 
                            fill=True,clip_on=False)) 
ax.add_patch(patches.Circle((4,TICKYPOS),radius=.2, 
                            fill=False,clip_on=False)) 
ax.add_patch(patches.Rectangle((6-.1,TICKYPOS-.05),.2,.2, 
                               fill=True,clip_on=False)) 
ax.add_patch(patches.Rectangle((8-.1,TICKYPOS-.05),.2,.2, 
                               fill=False,clip_on=False)) 

结果如下图:

设置clip_on为False是关键,否则轴外的patches将不会显示。补丁的坐标和大小(半径、宽度、高度等)将取决于您的轴在图中的位置。例如,如果您正在考虑对子图执行此操作,您将需要对补丁放置敏感,以免与任何其他轴重叠。这可能值得您花时间调查 Transformations ,并在其他单位(轴、图形或显示)中定义位置和大小。

如果您有要用于符号的特定图像文件,您可以使用 BboxImage 类来创建要添加到轴而不是补丁的艺术家。例如,我使用以下脚本制作了一个简单的图标:

import matplotlib.pyplot as plt 
 
fig = plt.figure(figsize=(1,1),dpi=400) 
ax = fig.add_axes([0,0,1,1],frameon=False) 
ax.set_axis_off() 
 
ax.plot(range(10),linewidth=32) 
ax.plot(range(9,-1,-1),linewidth=32) 
 
fig.savefig('thumb.png') 

生成这张图片:

然后我在我想要刻度标签和我想要的大小的位置创建了一个 BboxImage:

lowerCorner = ax.transData.transform((.8,TICKYPOS-.2)) 
upperCorner = ax.transData.transform((1.2,TICKYPOS+.2)) 
 
bbox_image = BboxImage(Bbox([lowerCorner[0], 
                             lowerCorner[1], 
                             upperCorner[0], 
                             upperCorner[1], 
                             ]), 
                       norm = None, 
                       origin=None, 
                       clip_on=False, 
                       ) 

注意到我如何使用 transData 转换将数据单位转换为显示单位,这在 Bbox 的定义中是必需的。

现在我使用 imread 例程读取图像,并将其结果(一个 numpy 数组)设置为 bbox_image 的数据并将艺术家添加到轴:

bbox_image.set_data(imread('thumb.png')) 
ax.add_artist(bbox_image) 

这会产生一个更新的数字:

如果您直接使用图像,请确保导入所需的类和方法:

from matplotlib.image import BboxImage,imread 
from matplotlib.transforms import Bbox