【问题标题】:Make a line in faceted ggplot2 with width from dataframe在多面 ggplot2 中画一条线,宽度来自数据框
【发布时间】:2014-11-13 15:09:51
【问题描述】:

我希望使用下面提供的数据创建一个类似于下面第二张图片的图表。但是,我无法让线的宽度与轴“B”相对应,也无法从 datlines$width 中获取值。我想要的是 geom_hline(或者可能是 geom_ribbon?)从 data.frame“datlines”中读取宽度并创建一条宽度等于 datlines$width 中提供的数字的线。到目前为止,即使我在 geom_hlines 调用中指定“size = width”,我也无法使其工作。

有什么建议吗?即使我得到 size = width 部分来镜像我的 datlines data.frame,线的大小也不对应 y 轴。

如果我也必须告诉 ggplot2 灰色区域的上下边界,我会很好。

dat
  A B      C
1 1 2 Facet1
2 1 3 Facet2
3 2 4 Facet1
4 2 5 Facet2

datlines
  int      C width
1   3 Facet1   1.0
2   4 Facet2   0.5

下面第一张图的数据和代码

dat <- data.frame(A = c(1, 1, 2, 2), B = c(2, 3, 4, 5), C = c("Facet1", "Facet2"))
dat
datlines <- data.frame(int = c(3, 4), C = c("Facet1", "Facet2"), width = c(1, 0.5))
datlines
plot <- ggplot(dat, aes(x = A, y = B)) +  
  geom_hline(data = datlines, aes(yintercept = int), colour = "gray") + geom_point() + facet_grid(. ~ C) 
plot

由我提供的代码生成的图表:

我想要的图表:

【问题讨论】:

    标签: r ggplot2 line


    【解决方案1】:

    使用geom_rect

    dat <- data.frame(A = c(1, 1, 2, 2), B = c(2, 3, 4, 5), 
                      C = c("Facet1", "Facet2"), 
                      width=c(1,0.5), int = c(3, 4))
    require(ggplot2)
    ggplot(dat, aes(x=A,y=B)) + geom_point() + facet_grid(~C) +
      geom_rect(aes(xmin=-Inf, xmax=Inf, 
                    ymin=int-width/2, ymax=int+width/2), fill = 'grey')
    

    【讨论】:

    • 这很好用,谢谢!我喜欢这个答案,因为将所有内容都保存在同一个 data.frame 中既好又干净——我没想到这样做。
    【解决方案2】:

    您可以使用 geom_rect,但您必须先修改 ymin 和 ymax:

    datlines$int2 <- c(2.5, 3.75)
    
    ggplot() + 
    geom_point(data=dat, aes(x = A, y = B)) +  
    geom_rect(data=datlines, aes(ymin=int2, ymax=int2+width, xmin=-Inf, xmax=+Inf), fill='grey', alpha=1)  + 
    facet_grid(. ~ C) 
    

    【讨论】:

    • 这也是一个有用的解决方案,如果将来更容易,可以将数据框分开。
    猜你喜欢
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多