【发布时间】:2019-05-26 00:09:15
【问题描述】:
这是一个与this 相关的问题,很受欢迎。在那个问题中,我看到了有关如何在不同坐标处绘制图像(或不同图像)的答案,如散点图。
使用TextArea 我可以将小字符串而不是图像放在不同的坐标处。
如果我想放一个由 matplotlib 本身生成的绘图/图像的迷你版本呢?假设我不想使用image.jpg,而是想使用plt.stem(arr) 的结果作为散点图中的图像。
我该怎么做? plt.plot(x, y) 的输出的微型版本怎么样?
我尝试将链接问题中给出的函数修改为:
def stem_scatter(x, y, arr, ax=None):
from matplotlib.offsetbox import AnnotationBbox, DrawingArea
if ax is None:
ax = plt.gca()
im = DrawingArea(0.1, 0.1)
im.add_artist(plt.stem(arr))
x, y = np.atleast_1d(x, y)
artists = []
for x0, y0 in zip(x, y):
ab = AnnotationBbox(im, (x0, y0), xycoords='data', frameon=False)
artists.append(ax.add_artist(ab))
ax.update_datalim(np.column_stack([x, y]))
ax.autoscale()
return artists
但这给出了一个错误:
AttributeError: 'StemContainer' object has no attribute 'is_transform_set'
编辑:来自链接的问题:
"…. but the second has a large advantage. The annotation box approach will allow the image to stay at a constant size as you zoom in."
这将是可接受的答案中的一个理想功能,因为在放大时希望看到散点的相对位置。如果散点图图像没有保持固定大小(相对于屏幕而不是当前轴限制),那么放大将无济于事。
【问题讨论】:
-
有点hacky,不过你可以用
plt.savefig保存图片,然后使用链接问题中的方法 -
@BlackBear 确实(或使用 PIL 避免保存到磁盘的一种变体)是我目前正在做的事情......但如果你有一个包含几百个点的散点图,它不会似乎是最好的方法。
-
您已经得到了 matplotlib 开发人员之一的回答。赏金有什么用?您是否尝试过使用插入轴?
-
@ImportanceOfBeingErnest 我不确定这是否真的是一个答案,而更像是一个可能方向的建议......这可能会也可能不会奏效。而且......不,我没有尝试,主要是因为答案中的链接有一个突出的警告,即该功能是实验性的,API 可能会改变。
-
也来自链接的问题:“......但第二个有很大的优势。注释框方法将允许图像在放大时保持恒定大小。”。我不完全确定,但我的实验表明,对于幼稚的
inset_axes方法而言,这不是真的。
标签: python matplotlib