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))
2条答案
按热度按时间ssgvzors1#
我会删除tick标签并将文本替换为补丁。下面是执行此任务的一个简短示例:
字符串
这将导致下图:
的数据
将
clip_on
设置为False
是关键,否则轴外的patches
将不会显示。(半径,宽度,高度等)的补丁将取决于你的轴在图中的位置。例如,如果你正在考虑这样做的子图,你需要对补丁的位置敏感,以免与其他轴重叠。2这可能值得你花时间研究Transformations,并在其他单位(轴,图形或显示)中定义位置和大小。如果你有特定的图像文件要用于符号,你可以使用
BboxImage
类来创建要添加到轴上的艺术家而不是补丁。例如,我用下面的脚本制作了一个简单的图标:型
产生这个图像:
的
然后,我在我想要的位置创建了一个BboxImage标签和我想要的大小:
型
注意到我如何使用
transData
转换将数据单位转换为显示单位,这是Bbox
定义中所需的。现在我使用
imread
例程读取图像,并将其结果(一个numpy数组)设置为bbox_image
的数据,并将艺术家添加到轴:型
这将导致更新的图:
如果您直接使用图像,请确保导入所需的类和方法:
型
r6l8ljro2#
另一种方法有一些缺点,因为它使用静态坐标,因此在改变图形大小或缩放和平移图时不起作用。
一个更好的选择是直接在选择的坐标系中定义位置。对于x轴,使用数据坐标表示x位置,使用轴坐标表示y位置是有意义的。
使用
matplotlib.offsetbox
es可以使这变得相当简单。下面将分别在坐标(-5,0)和(5,0)处放置一个带圆圈的框和一个带图像的框,并将它们向下偏移一点,这样它们看起来就像是ticklabel。字符串
x1c 0d1x的数据
请注意,许多形状都是以unicode符号的形式存在的,因此您可以使用这些符号简单地设置ticklabels。