首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用ggplot的堆叠范围图

使用ggplot的堆叠范围图
EN

Stack Overflow用户
提问于 2021-06-10 21:25:59
回答 2查看 86关注 0票数 0

假设我希望用下面的设计制作一个范围图,并使用下列虚拟数据的ggplot:

有着下面的传说。

代码语言:javascript
运行
复制
set.seed(1)
test.dat <- data.frame(
  yval = sample(1:100, 40),
  xcat = rep(LETTERS[1:4], 10),
  base = sample(c(1, 0),40, replace=T),
  col = rep(c("red", "blue"), 40)
)

> head(test.dat)
  yval xcat base  col
1   68    A    0  red
2   39    B    0 blue
3    1    C    0  red
4   34    D    1 blue
5   87    A    0  red
6   43    B    0 blue

灰色部分显示数据的范围,其中base == 1和类似于晶须的线条(类似于错误条)使用为每个xcat设计的各自颜色显示base == 0所在的数据范围。

因此,使用这些虚拟数据,我希望:

代码语言:javascript
运行
复制
minmax <- function(x){
      return(
        c(min(x),max(x))
      )
    }

> minmax(test.dat[test.dat$xcat == "D" & test.dat$base == 1,]$yval)
[1] 24 99
> minmax(test.dat[test.dat$xcat == "D" & test.dat$base == 0,]$yval)
[1] 21 82
> unique(test.dat[test.dat$xcat == "D",]$col)
[1] "blue"

对于xcat == "D",灰色条的范围从24到99,蓝色的晶须线在21到82之间。

我怎样才能做到这一点?看起来,创建范围图没有简单明了的ggplot函数。

我的方法是调整geom_boxplot的铰链和耳语对灰色部分的定义,并使用geom_linegeom_linerange创建晶须线部分,但我不确定如何做到这一点。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-10 22:23:32

首先,为每一个组合(xcat、base和col)创建一个有min和max的数据。

代码语言:javascript
运行
复制
data2 <- test.dat %>% group_by(xcat, base, col) %>% summarise(min = min(yval), max=max(yval))

然后,使用geom_linerange表示灰色“条形图”,使用geom_errorbar表示晶须行:

代码语言:javascript
运行
复制
ggplot()+
   geom_linerange(data= data2 %>% filter(base==1), aes(x= xcat, ymin=min, ymax=max), size=12, alpha=0.5)+
   geom_errorbar(data= data2 %>% filter(base==0), aes(x= xcat, ymin=min, ymax=max),  colour=data2[data2$base==1,]$col, width=.2)

这是绘图

票数 1
EN

Stack Overflow用户

发布于 2021-06-10 22:23:40

我建议先使用dplyr/tidyr进行一些整形,然后使用geom_tile

代码语言:javascript
运行
复制
library(tidyverse)
test.dat %>%
  group_by(xcat, base, col) %>%
  summarize(mid = mean(range(yval)),
            range = diff(range(yval)), .groups = "drop") %>%
  pivot_wider(names_from = base, values_from = mid:range) %>%

ggplot(aes(x = xcat)) +
  geom_tile(aes(y = mid_0, height = range_0), fill = "gray70", color = "black") +
  geom_tile(aes(y = mid_1, height = range_1, fill = col), color = "black") +
  scale_fill_identity()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67928634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档