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

标签 python drawing plot matplotlib label

我不想用文字或数字作为 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))

结果如下图:

enter image description here

设置clip_onFalse是关键,否则轴外的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')

生成这张图片:

enter image description here

然后我在我想要刻度标签和我想要的大小的位置创建了一个 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)

这会产生一个更新的数字: enter image description here

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

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

关于python - 如何使用 matplotlib 使绘图的 xtick 标签成为简单的绘图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8733558/

相关文章:

python - Pandas 数据框转换为数据透视表

qt - 如何使用 Qt 进行粉笔风格绘图

c# - 具有透明背景的 RadioButtonRenderer

r - 如何调整geom_point()的scale_alpha?

python - 通过严格比较对函数进行向量化,以在 2D 数组中查找局部最小值和最大值

python - 创建一组流媒体和发布者

android - 绘制多条线并记住它们的粗细

python 和 matplotlib 以及更改标记颜色

python - 在 matplotlib.collections.PathCollection 中设置特定补丁的属性

python - hg 转换,Subversion python 绑定(bind)错误