【问题标题】:Can geom_image() from the ggimage package be made to preserve the image aspect ratio?可以使用 ggimage 包中的 geom_image() 来保留图像纵横比吗?
【发布时间】:2017-11-24 20:43:17
【问题描述】:

在研究this answer 时,我尝试通过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 行为的问题。我知道如何使用其他方法生成正确的图像,例如通过使用来自cowplot的draw_image()

【问题讨论】:

    标签: r ggplot2 ggimage


    【解决方案1】:
    ggplot(df_img, aes(x = phase, y = 0.25, image = image)) +
      geom_image(size = 0.5, by="height")+
      scale_size_identity()
    

    会产生

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

    【讨论】:

    • Re:从 URL 读取图像:我认为这两种方法都有优点。如果您想使用图像而不是点,您将多次绘制相同的图像,那么每次都清楚地重新读取它是不好的。但是,对于仅在绘图中添加几个图像的用例,如这里,要求用户设置一个单独的比例来将值映射到图像文件似乎过于复杂。
    • 我接受您关于“调整大小后不”的说法意味着我的问题的答案是“否”。因此,我将继续并接受您的回答。
    【解决方案2】:

    一个相当“原始”的解决方案:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-16
      • 1970-01-01
      • 2013-07-26
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多