1

我正在尝试制作一个最终看起来像这样的情节:

geom_linerange() 示例

但是,我希望每条线的端点代表每组数字的第 25 个百分位数(底部)和第 75 个百分位数(顶部)。中间的点应该是中位数。我可以用这些数据制作箱线图geom_boxplot(),但我认为这看起来会好很多。无论如何,我无法完成这项工作。现在我收到此错误消息:

Warning message:
In data.frame(x = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,  :
  row names were found from a short variable and have been discarded

我的数据如下所示:

> str(outbtu)
'data.frame':   86400 obs. of  2 variables:
 $ bias: num  -0.248 -0.759 -0.471 -0.304 -0.358 ...
 $ cnd : int  1 1 1 1 1 1 1 1 1 1 ...
> outbtu[1:10,]
          bias cnd
1  -0.24756150   1
2  -0.75906264   1
3  -0.47142178   1
4  -0.30395184   1
5  -0.35756559   1
6   0.04072695   1
7  -0.45026249   1
8  -0.20509166   1
9  -0.24816174   1
10 -0.01581920   1

其中,最终cnd达到 27,但 27 个值中的每一个都有 3200 个观测cnd值,因此您在这里显然看不到。bias我想要这张图上的 27 个线段,一个对应于27 个值中每一个的变量的第 25、50 和 75 个百分位数cnd

这是我的代码:

p <- ggplot(outbtu,aes(factor(cnd),bias,
                   ymin=quantile(bias,.25),
                   ymax=quantile(bias,.75)))
p <- p + geom_linerange()
p + geom_pointrange()

老实说,我什至不知道我是否接近,这正是我可以从 ggplot 帮助页面中得出的结论。提前致谢!

4

2 回答 2

3
set.seed(42)
DF <- data.frame(bias=rnorm(2700),cnd=1:27)
DF$cnd <- factor(DF$cnd)

library(ggplot2)
ggplot(DF,aes(x=cnd,y=bias,colour=cnd)) + 
  stat_summary(fun.data=function(x) {
    res <- quantile(x,probs=c(0.25,0.5,0.75))
    names(res)<-c("ymin","y","ymax")
    res})

或更短:

ggplot(DF,aes(x=cnd,y=bias,colour=cnd)) + 
  stat_summary(fun.data=median_hilow,conf.int=0.5)
于 2013-04-21T10:29:21.853 回答
2

您需要分别计算所有统计数据,然后绘制获得的中位数和分位数。否则ymin=quantile(bias,.25)返回大于 的向量factor(cnd)

这是一个例子

# Generate sample data
df <- data.frame(a=rnorm(100), b=sample(1:5, 100, replace=T))
# Calculate statistics for each group of b values
df2 <- t(sapply(unique(df$b), function(x) {
  s <- summary(df[df$b == x, "a"])[c(2,3,5)]
  c(x, s)
}))
# Convert output matrix to data.frame since ggplot works only with data.frames
df2 <- as.data.frame(df2)
# Rename column names for clarity
colnames(df2) <- c("b", "Q1", "Median", "Q3")
# Draw obtained values
ggplot(df2, aes(x=b, y=Median, ymin=Q1, ymax=Q3)) + geom_pointrange()
于 2013-04-21T04:48:57.413 回答