R: geom_image деформируется coord_fixed

Я пытаюсь разместить изображения на графике, который должен иметь фиксированные координаты (значения x, y - это координаты GPS, и я хочу, чтобы карта правильно масштабировалась). Если диапазоны x и y не совпадают, изображения сглаживаются.

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

Простой пример выглядит следующим образом:

require(tidyverse)
require(ggimage)

plot_image <- function(x_size, y_size) {

  dta_points <- crossing(x = c(-x_size, x_size), y = c(-y_size, y_size))
  dta_img <- data_frame(x = 0, y = 0, image = 'https://www.r-project.org/logo/Rlogo.png')

  ggplot(NULL, aes(x, y)) + 
    geom_point(data = dta_points) +
    geom_image(data = dta_img, aes(image = image), size = 1) +
    ggtitle(paste0('x_size: ', x_size, ', y_size: ', y_size)) +
    coord_fixed()
}

plot_image(x_size = 1, y_size = 1)
plot_image(x_size = 0.1, y_size = 1)
plot_image(x_size = 1, y_size = 0.1)

введите здесь описание изображения


person Jan Kislinger    schedule 05.08.2018    source источник


Ответы (2)


попробуйте geom_custom,

library(ggplot2)
library(png)
library(grid)
library(egg)

i <- readPNG(system.file("img", "Rlogo.png", package="png"))
img <- data.frame(x = 6, y = 3)
img$g <-  list(rasterGrob(i, width=unit(24,"pt")))

ggplot(iris, aes(x = Sepal.Length, y = Petal.Length)) + 
  geom_point() +
  geom_custom(data=img, aes(x,y,data=g), grob_fun=identity) +
  coord_fixed()
person user10185852    schedule 06.08.2018

Вы можете настроить аргументы xmin/xmax/ymin/ymax внутри annotation_custom, чтобы разместить изображение в любом месте, определяя его соотношение сторон:

library(ggplot2)
library(png)
library(grid)

download.file("https://www.r-project.org/logo/Rlogo.png", 'Rlogo.png', mode = 'wb')
image <- readPNG("Rlogo.png")
logo <- rasterGrob(image, interpolate = TRUE)

ggplot() + 
  annotation_custom(logo, xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf) 

Пример:

ggplot(iris, aes(x = Sepal.Length, y = Petal.Length)) + 
  annotation_custom(logo, xmin = 7, xmax = 8, ymin = 2, ymax = 4) +
  geom_point()

Дополнение к вашему комментарию:

Вам просто нужно указать эстетику x и y, чтобы сохранить исходное соотношение сторон, а size поможет с масштабированием, если это необходимо:

library(ggimage)

dta_img <- data.frame(x = 6, y = 3, image = 'https://www.r-project.org/logo/Rlogo.png')

ggplot(iris, aes(x = Sepal.Length, y = Petal.Length)) + 
  geom_image(data = dta_img, aes(x, y, image = image), size = 0.1) +
  geom_point()

введите здесь описание изображения

Пожалуйста, ознакомьтесь также с leaflet, в котором есть встроенные функции для создания красивых карт, похожих на ту, на которую вы ссылаетесь: Leaflet for Р

person Ozan147    schedule 05.08.2018
comment
Я понимаю, что это можно использовать только для одного изображения. Я неправильно использовал только одно изображение в своем примере. Я хочу создать сюжет, подобный этому: espatial.com/ wp-content/uploads/Default-Pin-Map.jpg Значит, мне придется добавлять все изображения в качестве аннотаций в цикле, верно? - person Jan Kislinger; 06.08.2018
comment
@ Ян Кислингер; вы можете явно использовать эстетику x и y, только что отредактировав мой ответ. - person Ozan147; 06.08.2018
comment
попробуйте добавить слой coord_fixed() к вашему последнему примеру. это также деформирует логотип (моя первоначальная проблема). спасибо за указание на листовку. я обязательно это проверю - person Jan Kislinger; 06.08.2018