我不想用文字或数字作为 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
关于python - 如何使用 matplotlib 使绘图的 xtick 标签成为简单的绘图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8733558/