可以使用 ggimage 包中的 geom_image() 来保持图像纵横比吗?

Can geom_image() from the ggimage package be made to preserve the image aspect ratio?

在研究 this answer, I tried to draw the image strip via geom_image() from the 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 行为的问题。我知道如何使用其他方法生成正确的图像,例如通过使用 cowplot 中的 draw_image()

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

会产生

如果指定了 by,大小将被映射并解释为数据 space 中的 npc,作为宽度或高度,以及为当前设备保持的宽高比(不是在调整大小之后) .如果大小为 Inf,则图片会拉伸以填满整个面板。

一个相当"raw"的解决方案:

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)