Размещение пользовательских изображений в окне графика - в качестве пользовательских маркеров данных или для аннотирования этих маркеров - PullRequest
28 голосов
/ 01 февраля 2011

У меня есть набор 150x150px изображений PNG и набор (x, y) координат, которым они соответствуют.Есть ли способ нанести изображение на сетку?Например, я ищу решение на R или Python, чтобы создать что-то вроде следующего: enter image description here

Ответы [ 5 ]

30 голосов
/ 01 февраля 2011

Вы создаете ограничивающий прямоугольник, создавая экземпляр AnnotationBbox - один раз для каждого изображения что вы хотите отобразить; изображение и его координаты передаются в конструктор.

Код явно повторяется для двух изображений, поэтому, как только этот блок помещен в функцию, он не такой длинный, как кажется здесь.

import matplotlib.pyplot as PLT
from matplotlib.offsetbox import AnnotationBbox, OffsetImage
from matplotlib._png import read_png

fig = PLT.gcf()
fig.clf()
ax = PLT.subplot(111)

# add a first image
arr_hand = read_png('/path/to/this/image.png')
imagebox = OffsetImage(arr_hand, zoom=.1)
xy = [0.25, 0.45]               # coordinates to position this image

ab = AnnotationBbox(imagebox, xy,
    xybox=(30., -30.),
    xycoords='data',
    boxcoords="offset points")                                  
ax.add_artist(ab)

# add second image
arr_vic = read_png('/path/to/this/image2.png')
imagebox = OffsetImage(arr_vic, zoom=.1)
xy = [.6, .3]                  # coordinates to position 2nd image

ab = AnnotationBbox(imagebox, xy,
    xybox=(30, -30),
    xycoords='data',
    boxcoords="offset points")
ax.add_artist(ab)

# rest is just standard matplotlib boilerplate
ax.grid(True)
PLT.draw()
PLT.show()

enter image description here

17 голосов
/ 02 февраля 2011

Один из способов сделать это в R (2.11.0 и выше):

library("png")
# read a sample file (R logo)
img <- readPNG(system.file("img", "Rlogo.png", package="png"))
# img2 <- readPNG(system.file("img", "Rlogo.png", package="png"))
img2 <- readPNG("hand.png", TRUE) # here import a different image 
if (exists("rasterImage")) { 
  plot(1:1000, type='n')
  rasterImage(img, 100, 100, 200, 200)
  rasterImage(img2, 300, 300, 400, 400)
}

См. ReadPNG и rasterImage для деталей.enter image description here

3 голосов
/ 02 февраля 2011

Также в R вы можете использовать функции my.symbols и ms.image в пакете TeachingDemos.

3 голосов
/ 01 февраля 2011

Я бы использовал для этого matplotlib. эта демонстрация показывает нечто похожее, я уверен, что оно может быть адаптировано к вашей конкретной проблеме

1 голос
/ 02 февраля 2011

В R, прочитанная в помощь (rasterImage):

require(grDevices)
#set up the plot region:
op <- par(bg = "thistle") <h>
plot(c(100, 250), c(300, 450), type = "n", xlab="", ylab="")
image <- as.raster(matrix(0:1, ncol=5, nrow=3))
rasterImage(image, 100, 300, 150, 350, interpolate=FALSE)
rasterImage(image, 100, 400, 150, 450)
rasterImage(image, 200, 300, 200 + xinch(.5), 300 + yinch(.3), interpolate=FALSE)
rasterImage(image, 200, 400, 250, 450, angle=15, interpolate=FALSE)
par(op)

.... хороший пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...