假设我希望用下面的设计制作一个范围图,并使用下列虚拟数据的ggplot:
有着下面的传说。
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
所在的数据范围。
因此,使用这些虚拟数据,我希望:
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_line
或geom_linerange
创建晶须线部分,但我不确定如何做到这一点。
谢谢。
发布于 2021-06-10 22:23:32
首先,为每一个组合(xcat、base和col)创建一个有min和max的数据。
data2 <- test.dat %>% group_by(xcat, base, col) %>% summarise(min = min(yval), max=max(yval))
然后,使用geom_linerange
表示灰色“条形图”,使用geom_errorbar
表示晶须行:
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)
这是绘图
发布于 2021-06-10 22:23:40
我建议先使用dplyr/tidyr进行一些整形,然后使用geom_tile
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()
https://stackoverflow.com/questions/67928634
复制相似问题