Я хочу прочитать список изображений в Python/Matplotlib, а затем нарисовать это изображение вместо других маркеров (например, точек) на графике. Я попытался с imshow, но мне это не удалось, потому что я не могу переместить изображение в другое положение и соответствующим образом масштабировать его. Может быть, у кого-то есть хорошая идея:)
Matplotlib: Как создавать изображения вместо точек?
Ответ 1
Есть два способа сделать это.
- Настройте изображение с помощью
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()
Ответ 2
Если вы хотите разные изображения:
Теперь это первый ответ, когда он прибегает к помощи "разбросать матплотлиб с изображениями". Если вы похожи на меня и вам действительно нужно нанести разные изображения на каждое изображение, попробуйте этот пример с минимальными затратами. Просто не забудьте ввести свои собственные изображения.
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)
ax.add_artist(ab)