带有多个标志的ggplot

时间:2017-04-18 01:26:48

标签: r ggplot2 flags qa

我有一个包含几个标志的基本数据集:

library(ggplot2)
X<-c(seq(1:10))
Y<-c(2,4,6,3,5,8,6,5,4,3)
Flag1<-c(0,0,0,0,1,0,0,1,0,0)
Flag2<-c(0,0,0,0,60,0,0,0,0,60)
Flag3<-c(12,0,12,12,12,12,12,0,0,12)
Flag4<-c(0,0,0,0,40,0,0,40,0,0)

DF<-data.frame(X,Y,Flag1,Flag2,Flag3,Flag4)

每个标志类型(1-4)包含“0”或特定于该标志类型的数字。我的目标是将上面的x / y数据绘制为基本线图

p<-ggplot(DF, aes(x=X, y=Y)) +geom_line() +geom_point(col='black', size=1)

但是比情节上的叠加点标记我有旗帜的位置。理想情况下,标志点会稍微大一些,每种Flag类型都会有不同的颜色。

我的一些旗帜点会重叠,所以我不确定什么是最美观的处理方式(可能是一个偏移以防止点重叠?)

2 个答案:

答案 0 :(得分:1)

您可以尝试从宽到长重新整形数据,即。为标志类型和标志值创建列。然后,您可以按标志类型着色,并使用size作为标志值。避免重叠的一种方法是geom_jitter

library(tidyr)
library(ggplot2)
DF %>% 
gather(flag, value, -X, -Y) %>% 
  ggplot(aes(X, Y)) + geom_line() + geom_jitter(aes(color = flag, size = value))

结果: enter image description here

另一种方法是使用facet_grid按标志类型单独绘制。

答案 1 :(得分:0)

library(data.table)
library(ggplot2)

X<-c(seq(1:10))
Y<-c(2,4,6,3,5,8,6,5,4,3)
Flag1<-c(0,0,0,0,1,0,0,1,0,0)
Flag2<-c(0,0,0,0,60,0,0,0,0,60)
Flag3<-c(12,0,12,12,12,12,12,0,0,12)
Flag4<-c(0,0,0,0,40,0,0,40,0,0)

DF<-data.frame(X,Y,Flag1,Flag2,Flag3,Flag4)

DF.long <- melt(DF, measure.vars=c("Flag1","Flag2","Flag3","Flag4"), variable="Flag")

因此,数据的组织方式为标记类型的单个列,以及相应值的单个列,即:

X Y     Flag value
1 2    Flag1     0
2 4    Flag1     0
3 6    Flag1     0
4 3    Flag1     0
5 5    Flag1     1
6 8    Flag1     0
7 6    Flag1     0
8 5    Flag1     1
9 4    Flag1     0
0 3    Flag1     0
1 2    Flag2     0
2 4    Flag2     0
3 6    Flag2     0
4 3    Flag2     0
5 5    Flag2    60
...etc

然后可以如下绘制:

p <- ggplot(DF.long, aes(x=X, y=Y)) +geom_line() +geom_jitter(size=2, aes(y=value, color=Flag))

geom_line()将从原始ggplot()调用继承X和Y,并且geom_jitter()设置为y具有自己的不同值(名为&#34的值;值&#34;在上面的示例中),每个旗帜都有独特的颜色:

enter image description here

编辑:啊,价值作为一个与价值相对应的尺寸,实际上更直观,我误解了;)

如neilfws的建议,使用size = value:

p2 <-ggplot(DF.long, aes(x=X, y=Y)) +geom_line() +geom_jitter(aes(size=value, color=Flag))