首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >geom_segment变长误差

geom_segment变长误差
EN

Stack Overflow用户
提问于 2016-12-10 18:32:28
回答 1查看 272关注 0票数 3

在我更新到2.2.0版本之前,下面的代码在ggplot2中工作。现在我得到了Error: Aesthetics must be either length 1 or the same as the data (30): x, y, xend, yend。错误是由两个geom_segment调用引起的。

代码语言:javascript
复制
drug1 <- c(.7, -1.6, -.2, -1.2, -.1, 3.4, 3.7, .8, 0, 2)
drug2 <- c(1.9, .8, 1.1, .1, -.1, 4.4, 5.5, 1.6, 4.6, 3.4)
d <- data.frame(Drug=c(rep('Drug 1', 10), rep('Drug 2', 10),
                  rep('Difference', 10)),
                extra=c(drug1, drug2, drug2 - drug1))

ggplot(d, aes(x=Drug, y=extra)) + 
  geom_boxplot(col='lightyellow1', alpha=.3, width=.5) + 
  geom_dotplot(binaxis='y', stackdir='center', position='dodge') +
  stat_summary(fun.y=mean, geom="point", col='red', shape=18, size=5) +
  geom_segment(aes(x=rep('Drug 1', 30), xend=rep('Drug 2', 30), y=drug1, yend=drug2),
               col=gray(.8)) +
  geom_segment(aes(x='Drug 1', xend='Difference', y=drug1, yend=drug2 - drug1),
               col=gray(.8)) +
  xlab('') + ylab('Extra Hours of Sleep') + coord_flip()

更新:工作的改进代码:

代码语言:javascript
复制
drug1 <- c(.7, -1.6, -.2, -1.2, -.1, 3.4, 3.7, .8, 0, 2)
drug2 <- c(1.9, .8, 1.1, .1, -.1, 4.4, 5.5, 1.6, 4.6, 3.4)
d <- data.frame(Drug=c(rep('Drug 1', 10), rep('Drug 2', 10),
                  rep('Difference', 10)),
                extra=c(drug1, drug2, drug2 - drug1))
w <- data.frame(drug1, drug2, diff=drug2 - drug1)

ggplot(d, aes(x=Drug, y=extra)) +
  geom_boxplot(col='lightyellow1', alpha=.3, width=.5) + 
  geom_dotplot(binaxis='y', stackdir='center', position='dodge') +
  stat_summary(fun.y=mean, geom="point", col='red', shape=18, size=5) +
  geom_segment(data=w, aes(x='Drug 1', xend='Drug 2', y=drug1, yend=drug2),
               col=gray(.8)) +
  geom_segment(data=w, aes(x='Drug 1', xend='Difference', y=drug1, yend=drug2 - drug1),
               col=gray(.8)) +
  xlab('') + ylab('Extra Hours of Sleep') + coord_flip()
EN

回答 1

Stack Overflow用户

发布于 2016-12-10 22:10:31

更新后的代码生成一个数据帧d,如下所示:

代码语言:javascript
复制
drug1 <- c(.7, -1.6, -.2, -1.2, -.1, 3.4, 3.7, .8, 0, 2)
drug2 <- c(1.9, .8, 1.1, .1, -.1, 4.4, 5.5, 1.6, 4.6, 3.4)
d <- data.frame(Drug=c(rep('Drug 1', 10), rep('Drug 2', 10),
                  rep('Difference', 10)),
                extra=c(drug1, drug2, drug2 - drug1))

> d
         Drug extra
1      Drug 1   0.7
2      Drug 1  -1.6
3      Drug 1  -0.2
4      Drug 1  -1.2
5      Drug 1  -0.1
6      Drug 1   3.4
7      Drug 1   3.7
8      Drug 1   0.8
9      Drug 1   0.0
10     Drug 1   2.0
11     Drug 2   1.9
12     Drug 2   0.8
13     Drug 2   1.1
14     Drug 2   0.1
15     Drug 2  -0.1
16     Drug 2   4.4
17     Drug 2   5.5
18     Drug 2   1.6
19     Drug 2   4.6
20     Drug 2   3.4
21 Difference   1.2
22 Difference   2.4
23 Difference   1.3
24 Difference   1.3
25 Difference   0.0
26 Difference   1.0
27 Difference   1.8
28 Difference   0.8
29 Difference   4.6
30 Difference   1.4

这是创建数据框架的一种有问题的方法,原因有两个:

  1. 变量drug1drug2既存在于全局环境中,也存在于data.frame d中。这可能导致混淆、掩蔽和其他错误。
  2. Difference与产生差异的值相关联的唯一方法是行排序。例如,第1行和第11行中的值产生了第21行中的差异。如果以后对数据集进行任何修改,这可能会造成问题。

我建议以这样的方式创建数据框架:

代码语言:javascript
复制
d2 <- data.frame(
  pair = 1:10,
  drug1 = c(.7, -1.6, -.2, -1.2, -.1, 3.4, 3.7, .8, 0, 2),
  drug2 = c(1.9, .8, 1.1, .1, -.1, 4.4, 5.5, 1.6, 4.6, 3.4)
) 

   pair drug1 drug2
1     1   0.7   1.9
2     2  -1.6   0.8
3     3  -0.2   1.1
4     4  -1.2   0.1
5     5  -0.1  -0.1
6     6   3.4   4.4
7     7   3.7   5.5
8     8   0.8   1.6
9     9   0.0   4.6
10   10   2.0   3.4

有一个显式的pair变量链接这些值,并且drug1drug2的额外副本不存在于d2之外。

然后,您可以使用tidyr将其转换为整洁/长格式(为了更好地用于ggplot和建模包):

代码语言:javascript
复制
tidyr::gather(d2, drug, value, drug1, drug2)

   pair  drug value
1     1 drug1   0.7
2     2 drug1  -1.6
3     3 drug1  -0.2
4     4 drug1  -1.2
5     5 drug1  -0.1
6     6 drug1   3.4
7     7 drug1   3.7
8     8 drug1   0.8
9     9 drug1   0.0
10   10 drug1   2.0
11    1 drug2   1.9
12    2 drug2   0.8
13    3 drug2   1.1
14    4 drug2   0.1
15    5 drug2  -0.1
16    6 drug2   4.4
17    7 drug2   5.5
18    8 drug2   1.6
19    9 drug2   4.6
20   10 drug2   3.4
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41078897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档