我想将图像列表读入Python / Matplotlib,然后在图形中绘制此图像而不是其他标记(如点)。我尝试过imshow但是我没有成功,因为我不能将图像移动到另一个位置并适当地缩放它。也许有人有个好主意:)
答案 0 :(得分:37)
有两种方法可以做到这一点。
imshow
根据您想要图片的位置设置extent
kwarg来绘制图像。OffsetImage
内使用AnnotationBbox
。第一种方式是最容易理解的,但第二种方式具有很大的优势。 k注释框方法将允许图像在放大时保持恒定大小。使用imshow
会将图像的大小与图的数据坐标联系起来。
以下是第二个选项的示例:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
from matplotlib.cbook import get_sample_data
def main():
x = np.linspace(0, 10, 20)
y = np.cos(x)
image_path = get_sample_data('ada.png')
fig, ax = plt.subplots()
imscatter(x, y, image_path, zoom=0.1, ax=ax)
ax.plot(x, y)
plt.show()
def imscatter(x, y, image, ax=None, zoom=1):
if ax is None:
ax = plt.gca()
try:
image = plt.imread(image)
except TypeError:
# Likely already an array...
pass
im = OffsetImage(image, zoom=zoom)
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
main()
答案 1 :(得分:7)
如果您要使用其他图像:
这是谷歌搜索“ matplotlib散布图像”时的第一个答复。如果您像我一样,实际上需要在每个图像上绘制不同的图像,请尝试使用此最小化示例。只需确保输入自己的图像即可。
import matplotlib.pyplot as plt
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
def getImage(path):
return OffsetImage(plt.imread(path))
paths = [
'a.jpg',
'b.jpg',
'c.jpg',
'd.jpg',
'e.jpg']
x = [0,1,2,3,4]
y = [0,1,2,3,4]
fig, ax = plt.subplots()
ax.scatter(x, y)
for x0, y0, path in zip(x, y,paths):
ab = AnnotationBbox(getImage(path), (x0, y0), frameon=False)