Можно ли сделать geom_image() из пакета ggimage для сохранения соотношения сторон изображения?

Исследуя этот ответ, я попытался нарисовать полосу изображения через geom_image() из пакета ggimage, но не смог заставить его работать. geom_image() изменяет пропорции изображения, и я не знаю, как это предотвратить (или возможно ли это). Мне тоже не понятно в каких единицах size измеряется. Из того, как код ведет себя, может быть, это в npc координаты, бегущие от 0 до 1, независимо от системы координат ggplot2?

Вот код, который я использовал:

require(ggimage)
df_img <- data.frame(phase = c("Interphase", "Prophase", "Metaphase", "Anaphase", "Telophase"),
                     image = c("http://www.microbehunter.com/wp/wp-content/uploads/2009/lily_interphase.jpg",
                               "http://www.microbehunter.com/wp/wp-content/uploads/2009/lily_prophase.jpg",
                               "http://www.microbehunter.com/wp/wp-content/uploads/2009/lily_metaphase2.jpg",
                               "http://www.microbehunter.com/wp/wp-content/uploads/2009/lily_anaphase2.jpg",
                               "http://www.microbehunter.com/wp/wp-content/uploads/2009/lily_telophase.jpg"))
df_img$phase <- factor(df_img$phase, levels=df_img$phase)

ggplot(df_img, aes(x = phase, y = 0, image = image)) + geom_image(size = 0.18)

И это полученное изображение:

Вот как должно выглядеть изображение:

Примечание: это вопрос конкретно о поведении ggimage. Я знаю, как создать правильное изображение, используя другие подходы, например, используя draw_image() с коровьего участка.

2 ответа

Решение
ggplot(df_img, aes(x = phase, y = 0.25, image = image)) +
  geom_image(size = 0.5, by="height")+
  scale_size_identity()

будет производить

Если by указан, размер отображается и интерпретируется как npc в пространстве данных, как ширина или высота, и соотношение сторон, поддерживаемое для текущего устройства (не после изменения размера). Если размер Inf, изображение растягивается, чтобы заполнить всю панель.

Довольно "сырое" решение:

p <- ggplot(df_img, aes(x = phase, y = 0, image = image)) + 
     geom_image(size = 0.18) +  coord_fixed()

g <- ggplotGrob(p)   
for (k in 1:length(g$grobs[[6]]$children[[3]]$children)) {
  g$grobs[[6]]$children[[3]]$children[[k]]$height <- unit(0.8,"native")
}
library(grid)
grid.draw(g)

Другие вопросы по тегам