将附加点绘制到现有情节的有效方法

时间:2017-08-27 17:36:53

标签: r ggplot2 dplyr

在我的情况下,有100个唯一(XY)点,每个点都有一个ID,属于Type。在这100个点中,20个点具有其他三种类型的值(CTDOP)。

以下是数据生成过程:

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"

enter image description here

注意:我添加了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))

enter image description here

问题:

  1. 如何在一个命令中或以优雅的方式绘制选定的点和附加点?

  2. 是否有可能在上述命令中使用的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") 方法?

  3. 更新dplyr非常重要,因为它只允许绘制剩余的点一次。否则,其中某些点具有df$Type=="ID"CTD中的值会导致重复绘图。

    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的值。但这些点只需要绘制一次。

2 个答案:

答案 0 :(得分:2)

更新答案

要解决第一条评论:有些点会多次绘制,因为数据中有多行具有相同的X Y坐标。您可以使用下面的代码删除重复的点。我们首先根据Val的顺序对点进行排序,以便重复点来自Other点,而不是来自D_1D_4点(尽管您的真实数据包含D_1D_4点具有相同XY坐标的情况,只会绘制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() 

enter image description here

如果您想绘制所有D_1D_4点,即使它们具有相同的XY坐标,您也可以这样做:

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_1D_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()

enter image description here

您还可以使用尺寸来使所需的点更突出。对于此特定数据集,此方法还可确保我们可以在上一个图中看到隐藏在灰点后面的几个D_1D_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()

enter image description here

答案 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"))