Можно ли сделать 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)