带有多个标志的 ggplot
ggplot with multiple flags
我有一个包含几个标志的基本数据集:
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)
但不是在情节上叠加点来标记我有旗帜的地方。理想情况下,标志点会稍微大一些,并且每种标志类型都会有不同的颜色。
我的一些标志点会重叠,所以我不确定处理这个问题的最美观的方式是什么(也许是一个偏移量来防止点重叠?)
您可以尝试将数据从宽改成长,即为标志类型和标志值创建列。然后您可以按标志类型着色并使用 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))
结果:
另一种选择是使用 facet_grid
按标志类型单独绘制。
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 值(名为 [= 的列27=] 在上面的例子中),每个标志都有一个独特的颜色:
编辑:啊哈,值作为与值对应的大小,实际上会更直观,我误解了;)
按照 neilfws 的建议,使用 size=value:
p2 <-ggplot(DF.long, aes(x=X, y=Y)) +geom_line() +geom_jitter(aes(size=value, color=Flag))
我有一个包含几个标志的基本数据集:
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)
但不是在情节上叠加点来标记我有旗帜的地方。理想情况下,标志点会稍微大一些,并且每种标志类型都会有不同的颜色。
我的一些标志点会重叠,所以我不确定处理这个问题的最美观的方式是什么(也许是一个偏移量来防止点重叠?)
您可以尝试将数据从宽改成长,即为标志类型和标志值创建列。然后您可以按标志类型着色并使用 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))
结果:
另一种选择是使用 facet_grid
按标志类型单独绘制。
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 值(名为 [= 的列27=] 在上面的例子中),每个标志都有一个独特的颜色:
编辑:啊哈,值作为与值对应的大小,实际上会更直观,我误解了;)
按照 neilfws 的建议,使用 size=value:
p2 <-ggplot(DF.long, aes(x=X, y=Y)) +geom_line() +geom_jitter(aes(size=value, color=Flag))