R ggplot2:如何根据另一个变量更改箱线图的宽度?
我创建了一个方框图,显示了一些物种的扩散距离R ggplot2:如何根据另一个变量更改箱线图的宽度?,r,ggplot2,boxplot,R,Ggplot2,Boxplot,我创建了一个方框图,显示了一些物种的扩散距离$dist,我希望方框的宽度与这些物种的再生密度成比例。我使用了“varwidth”和重量美学,如下所示,但这仍然是不正确的,因为它仍然与观察次数成正比,而不仅仅与再生密度成正比 (对于密度,我计算了每个物种的比例,从10到100。它在data\u dist2$prop2列中给出) 重量似乎并不是专门为此设计的,但你可以稍微调整一下。首先请注意,给每个组的权重是观察值的权重之和,因此,如果每个物种的观察值不同,则可能需要将prop2更改为当前值除以组
$dist
,我希望方框的宽度与这些物种的再生密度成比例。我使用了“varwidth”和重量美学,如下所示,但这仍然是不正确的,因为它仍然与观察次数成正比,而不仅仅与再生密度成正比
(对于密度,我计算了每个物种的比例,从10到100。它在data\u dist2$prop2
列中给出)
重量似乎并不是专门为此设计的,但你可以稍微调整一下。首先请注意,给每个组的权重是观察值的权重之和,因此,如果每个物种的观察值不同,则可能需要将
prop2
更改为当前值除以组中的观察值。(我无法从你的例子判断这是否适用)
然后请注意,宽度与重量的平方根成正比,因此请更改代码,以使用以下命令反转宽度:
p <- ggplot(data_dist2, aes(x = reorder(spe, prop2), y = dist)) +
coord_flip() +
geom_boxplot(varwidth = TRUE, alpha=0.3, aes(weight=data_dist2$prop2^2), fill='grey10')
pMiff比我强,但不管怎样,我的答案是这样的。正如Miff所说,您可以通过prop2
对宽度进行加权
ggplot(data_dist2, aes(x = reorder(spe, prop2), y = dist)) +
geom_boxplot(aes(weight = prop2),
varwidth = TRUE,
fill='grey10', alpha=0.3) +
coord_flip()
但是geom_boxplot()
隐式地考虑了样本大小。所以你需要在你的体重中分开。下面是如何使用data.table
library(data.table)
setDT(data_dist2) # convert to data.table
data_dist2[, weight := prop2 / .N, by = spe] # Divide prop2 by sample size for each species
ggplot(data_dist2, aes(x = reorder(spe, prop2), y = dist)) +
geom_boxplot(aes(weight = weight), # note weight = weight, not weight = prop2
varwidth = TRUE,
fill='grey10', alpha=0.3) +
coord_flip()
您能否提供一个可复制的数据集示例?(请阅读本教程:)。如果prop2
的范围为10到100,则可以设置aes(width=I(prop2/100))
。这将把宽度设置为0.1到1。您好@Drumy,谢谢您的回答。你把宽度放在哪里?我收到这个错误消息:警告:忽略未知美学:widthOops,我认为geom_boxplot
接受width
作为美学。我的错。解决方案比那要复杂一点。请看下面我的回答。谢谢,我试过这个方法,也试过下面@Miff给出的其他方法。这似乎很清楚,但当我将其应用于所有物种时,仍然没有得到好的结果。我还尝试创建一个新列,其中包含观察次数(w)的平方根,因此我使用weight=prop2/w来“取消”观察次数给定的权重。但它看起来仍然不像它应该的样子。。。我必须去参加一个会议,但我会马上再试一次,并让你知道!
ggplot(data_dist2, aes(x = reorder(spe, prop2), y = dist)) +
geom_boxplot(aes(weight = prop2),
varwidth = TRUE,
fill='grey10', alpha=0.3) +
coord_flip()
library(data.table)
setDT(data_dist2) # convert to data.table
data_dist2[, weight := prop2 / .N, by = spe] # Divide prop2 by sample size for each species
ggplot(data_dist2, aes(x = reorder(spe, prop2), y = dist)) +
geom_boxplot(aes(weight = weight), # note weight = weight, not weight = prop2
varwidth = TRUE,
fill='grey10', alpha=0.3) +
coord_flip()