为每n个观察点绘制一个点

时间:2015-10-19 09:13:35

标签: r ggplot2

我想使用ggplot来实现以下情节类型:

sketch of a ggplot showing one dot for every 10 observations

使用以下数据:

t <- read.table(header=T, row.names=NULL, 
    colClasses=c(rep("factor",3),"numeric"), text=
"week   team   level   n.persons
1      A      1       50
1      A      2       20
1      A      3       30
1      B      1       50
1      B      2       20
2      A      2       20
2      A      3       40
2      A      4       20
2      B      3       30
2      B      4       20")

到目前为止,通过应用此转换

t0 <- t[ rep(1:nrow(t), t$n.persons %/% 10 ) , ]

并密谋

ggplot(t0) + aes(x=week, y=level, fill=team) +
geom_dotplot(binaxis="y", stackdir="center",
           position=position_dodge(width=0.2) 

我可以生成

my archievement in ggplot so far: dots do not dodge each other vertically

A:如何让不同球队的球队垂直躲避并且不重叠?

B:整个点包装是否总是居中,即        如果一个地方只有一个团队的小点,就不会发生躲闪吗?

1 个答案:

答案 0 :(得分:2)

以下代码停止重叠:

t0 <- t[ rep(1:nrow(t), t$n.persons %/% 10 ) , ]

t0$level <- as.numeric(t0$level) # This changes the x-axis to numerics

t0$level <- ifelse(t0$team == "B", (t0$level+.1), t0$level) # This adds .1 to the position on the x-axis if the team is 'B'

ggplot(t0) + aes(x=week, y=level, fill=team) + geom_dotplot(binaxis="y", stackdir="center",
           position=position_dodge(width=0.2)) 

这是输出:

enter image description here

如果您愿意,也可以减去一个向下移动点的值。

如果您希望线条恰好在点之间,则此代码应该执行此操作:

t0$level <- ifelse(t0$team == "B", (t0$level+.06), t0$level)
t0$level <- ifelse(t0$team == "A", (t0$level-.06), t0$level)

输出:

enter image description here

我不确定如何在给定坐标只有一个团队的情况下跳过上面的ifelse。我想象你需要在每个坐标上计算一组独特的团队标签,并且只有当这个数量是&gt; 1然后运行上面的代码。