Подтвердить что ты не робот

Matplotlib: Как создавать изображения вместо точек?

Я хочу прочитать список изображений в Python/Matplotlib, а затем нарисовать это изображение вместо других маркеров (например, точек) на графике. Я попытался с imshow, но мне это не удалось, потому что я не могу переместить изображение в другое положение и соответствующим образом масштабировать его. Может быть, у кого-то есть хорошая идея:) It should look somehow like this! (Without the Spongebob, but with very serious data of course!)

4b9b3361

Ответ 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()

enter image description here

Ответ 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)

enter image description here