在ggplot中是否有类似于plot中varwidth选项的等效选项?

9
我正在使用ggplot创建箱线图,并希望表示每个箱子所贡献的样本量。在基本的plot函数中,有一个varwidth选项。在ggplot中有相应的等效选项吗?
例如,在基本绘图中:
data <- data.frame(rbind(cbind(rnorm(700, 0,10), rep("1",700)),
                         cbind(rnorm(50, 0,10), rep("2",50))))
data[ ,1] <- as.numeric(as.character(data[,1]))
plot(data[,1] ~ as.factor(data[,2]), varwidth = TRUE)

enter image description here


3
我好像记得有人在邮件列表上很久以前问过这个问题,他们被告知这是不可能的。在 Github 的问题中没有任何提到这点的内容,所以可能仍然不可行。(另一个选择是使用填充颜色。) - joran
无法使用ggplot实现,如果您只生成一个图表,则可以在Illustrator或类似软件中进行修改。 - Omar Wagih
1
@joran 我从痛苦的经历中学到,称R中的任何事情都是不可能的只会成为别人证明你错误的诱饵。在这种情况下,强大的@kohske提供了一个解决方法。 - Andrie
每个箱线图有多少个数据点? - Roman Luštrik
2
现在已经使用varwidth参数实现了这一点。请参见此问题:https://dev59.com/BYLba4cB1Zd3GeqPbz-Q - Cotton.Rockwood
2个回答

7

虽然不太优雅,但你可以这样实现:

data <- data.frame(rbind(cbind(rnorm(700, 0,10), rep("1",700)),
                         cbind(rnorm(50, 0,10), rep("2",50))))
data[ ,1] <- as.numeric(as.character(data[,1]))
w <- sqrt(table(data$X2)/nrow(data))
ggplot(NULL, aes(factor(X2), X1)) + 
  geom_boxplot(width = w[1], data = subset(data, X2 == 1)) +
  geom_boxplot(width = w[2], data = subset(data, X2 == 2))

如果您有多个 X2 的层级,那么您可以避免硬编码所有层级:

enter image description here

ggplot(NULL, aes(factor(X2), X1)) + 
  llply(unique(data$X2), function(i) geom_boxplot(width = w[i], data = subset(data, X2 == i)))

您可以提交功能请求: https://github.com/hadley/ggplot2/issues。该网址链接到一个GitHub页面,您可以在此页面上输入您的请求和建议。

2

目前版本的ggplot2(V 2.1.0)现在包含一个varwidth选项:

data <- data.frame(rbind(cbind(rnorm(700, 0,10), rep("1",700)),
                     cbind(rnorm(50, 0,10), rep("2",50))))
data$X1 <- as.numeric(as.character(data$X1))
ggplot(data = data, aes(x = X2, y = X1)) + 
    geom_boxplot(varwidth = TRUE) 

Example output plot from ggplot2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接