Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R ggplot2:如何根据另一个变量更改箱线图的宽度?_R_Ggplot2_Boxplot - Fatal编程技术网

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()