【问题标题】:ggplot2 - Size Aesthetic for Text and Point Geomsggplot2 - 文本和点几何的大小美学
【发布时间】:2016-03-03 02:46:55
【问题描述】:

我正在使用ggplot2 制作散点图,我希望将尺寸美学映射到geom_point()geom_text() 几何,但使用不同的连续变量来指定该尺寸。

有一个couple 的问题similar 这个问题,但它们都不是我要问的。我想在两个不同的几何图形上使用相同的美学,而不是在同一个几何图形上使用相同的美学。我想要一个带标签的散点图,其中点的大小和文本的大小映射到不同的连续变量。我不需要文本映射来拥有图例。下面是我的尝试。

library(ggplot2)

ggplot(data = mtcars) +
  geom_point(aes(x = hp, y = mpg, size = qsec)) +
  geom_text(aes(x = hp, y = mpg, 
                label = row.names(mtcars), size = wt))

如您所见,第二种美学是唯一出现在图表上的美学,但似乎两个图例都被绘制在另一个之上。这是可以做到的吗?

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    geom_point 中,您希望将qsec 映射到size;在geom_text 中,您希望将wt 映射到sizeggplot2 不允许两个不同大小的映射。但是通过一点gtable 魔法,您可以获得您想要的结果。创建两个情节:一个带有点;第二个是文本。但是对于文本图,请确保背景是透明的,并且网格线是空白的。

    然后使用gtable,从第二个文本图中抓取绘图面板,并插入到第一个绘图的绘图面板插槽中。

    library(ggplot2)
    library(gtable)
    library(grid)
    
    p1 = ggplot(data = mtcars) +
      geom_point(aes(x = hp, y = mpg, size = qsec))
    
    
    p2 = ggplot(data = mtcars) +
      geom_text(aes(x = hp, y = mpg, 
                    label = row.names(mtcars), size = wt))
    
    p2 = p2 + 
       theme(panel.background = element_rect(fill = "transparent", colour = NA), 
        panel.grid = element_blank())
    
    gA = ggplotGrob(p1)
    gB = ggplotGrob(p2)
    
    gB = gtable_filter(gB, "panel")   # grab the plot panel from gb
    
    # Get the positions of the panel in gA in the layout: t = top, l = left, ...
    pos <-c(subset(gA$layout, grepl("panel", gA$layout$name), select = t:r))
    
    gC = gtable_add_grob(gA, gB, t = pos$t, l = pos$l)   # overlay gB's panel into panel slot in gA
    
    grid.newpage()
    grid.draw(gC)
    

    【讨论】:

      猜你喜欢
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      • 1970-01-01
      相关资源
      最近更新 更多