在我的情况下,有100个唯一(X
,Y
)点,每个点都有一个ID,属于Type
。在这100个点中,20个点具有其他三种类型的值(CT
,D
,OP
)。
以下是数据生成过程:
df <- data.frame(X=rnorm(100,0,1), Y=rnorm(100,0,1),
ID=paste(rep("ID", 100), 1:100, sep="_"),
Type=rep("ID",100),
Val=c(rep(c('Type1','Type2'),30),
rep(c('Type3','Type4'),20)))
随机选择的20个点(sample(1:100,20)
)将具有向点添加额外信息的值。此额外Type
中的所有这20个点都将包含Type=="ID"
中的信息。
dat1 <- data.frame(Type=rep('CT',20),
Val=paste(rep("CT", 20),
sample(1:6,20,replace=T), sep="_"))
dat1 <- cbind(df[sample(1:100,20),1:3],dat1)
dat2 <- data.frame(Type=rep('D',20),
Val=paste(rep("D", 20),
sample(1:6,20,replace=T), sep="_"))
dat2 <- cbind(df[sample(1:100,20),1:3],dat2)
dat3 <- data.frame(Type=rep('OP',20),
Val=paste(rep("OP", 20),
sample(1:6,20,replace=T), sep="_"))
dat3 <- cbind(df[sample(1:100,20),1:3],dat3)
df <- rbind(df, dat1, dat2, dat3)
现在,绘制D_1
的{{1}},D_4
值的点。
Type=="D"
注意:我添加了ID df %>% filter(Val %in% c('D_1','D_4')) %>%
ggplot(aes(X,Y,col=Val)) + geom_point() + geom_text(aes(label=ID))
仅用于插图目的。
对于现有的情节,我必须添加剩余的92个点,这些点没有上述两个值或根本没有值。我尝试在Hadley here提到的现有方法中添加其他要点:
geom_text(aes(label=ID))
问题:
如何在一个命令中或以优雅的方式绘制选定的点和附加点?
是否有可能在上述命令中使用的p <- df %>% filter(Val %in% c('D_1','D_4')) %>% ggplot(aes(X,Y,col=Val)) + geom_point()
p + geom_point(data=df[(!df$ID %in% df$ID[df$Val %in% c('D_1','D_4')]) & df$Type=="ID",],
colour="grey")
方法?
更新:dplyr
非常重要,因为它只允许绘制剩余的点一次。否则,其中某些点具有df$Type=="ID"
或CT
或D
中的值会导致重复绘图。
OP
看起来,具有相同X,Y值的前三个点具有df %>% count(X,Y) %>% arrange(desc(n))
# # A tibble: 100 x 3
# X Y n
# <dbl> <dbl> <int>
# 1 -0.86266147 2.0368626 4
# 2 -0.61770678 0.4428537 4
# 3 1.32441957 -0.9388095 4
# 4 -1.65650319 -0.1551399 3
# 5 -0.99946809 1.1791395 3
# 6 -0.52881072 0.1742483 3
# 7 -0.25892382 0.1380577 3
# 8 -0.19239410 0.5269329 3
# 9 -0.09709764 -0.4855484 3
# 10 -0.05977874 0.1771422 3
# # ... with 90 more rows
ID,CT,D,OP的值。但这些点只需要绘制一次。
答案 0 :(得分:2)
要解决第一条评论:有些点会多次绘制,因为数据中有多行具有相同的X
Y
坐标。您可以使用下面的代码删除重复的点。我们首先根据Val
的顺序对点进行排序,以便重复点来自Other
点,而不是来自D_1
或D_4
点(尽管您的真实数据包含D_1
和D_4
点具有相同X
和Y
坐标的情况,只会绘制D_1
点。
ggplot(df %>%
mutate(Val=fct_other(Val,keep=c("D_1","D_4"))) %>%
arrange(Val) %>%
filter(!duplicated(.[,c("X","Y")])),
aes(X,Y,col=Val, size=Val)) +
geom_point() +
scale_colour_manual(values=c(D_1=hcl(15,100,65),D_4=hcl(195,100,65),Other="grey70")) +
scale_size_manual(values=c(D_1=3, D_4=3, Other=1)) +
theme_bw()
如果您想绘制所有D_1
和D_4
点,即使它们具有相同的X
和Y
坐标,您也可以这样做:
df %>%
mutate(Val=fct_other(Val,keep=c("D_1","D_4"))) %>%
arrange(X, Y, Val) %>%
filter((c(1,diff(X)) != 0 & c(1, diff(Y)) !=0) | Val != 'Other')
然后,您可以使用不同的点标记大小,以确保过度绘制的D_1
和D_4
点都可见。
如何折叠Val
的所有其他级别:
library(tidyverse)
library(forcats)
ggplot(df %>% mutate(Val=fct_other(Val,keep=c("D_1","D_4"))), aes(X,Y,col=Val)) +
geom_point() +
scale_colour_manual(values=c(D_1=hcl(15,100,65),D_4=hcl(195,100,65),Other="grey70")) +
theme_bw()
您还可以使用尺寸来使所需的点更突出。对于此特定数据集,此方法还可确保我们可以在上一个图中看到隐藏在灰点后面的几个D_1
和D_4
点。
ggplot(df %>% mutate(Val=fct_other(Val,keep=c("D_1","D_4"))), aes(X,Y,col=Val, size=Val)) +
geom_point() +
scale_colour_manual(values=c(D_1=hcl(15,100,65),D_4=hcl(195,100,65),Other="grey70")) +
scale_size_manual(values=c(D_1=3, D_4=3, Other=1)) +
theme_bw()
答案 1 :(得分:0)
在eipi10的帖子上建立一点
library(tidyverse)
library(forcats)
theme_set(theme_bw(base_size=12)+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank()))
df <- data_frame(X=rnorm(100,0,1), Y=rnorm(100,0,1),
ID=paste(rep("ID", 100), 1:100, sep="_"),
Type=rep("ID",100),
Val=c(rep(c('Type1','Type2'),30),
rep(c('Type3','Type4'),20)))
f.df <- function(x, type){
type = deparse(substitute(type))
df[sample(1:100,20), 1:3] %>%
mutate(Type=rep(type, 20),
Val=paste(rep(type, 20),
sample(1:6,20, replace=T), sep="_"))
}
dat1 <- f.df(df, CT)
dat2 <- f.df(df, D)
dat3 <- f.df(df, OP)
df2 <- bind_rows(df, dat1, dat2, dat3)
df2 %>%
mutate(Group = fct_other(Val,keep=c("D_1","D_4"))) %>%
ggplot(aes(X,Y,color=Group)) + geom_point() +
scale_colour_manual(values=c(D_1=hcl(15,100,65),D_4=hcl(195,100,65),
Other="grey70"))