使用从管道创建的ggplot高亮单个数据点

问题描述

我们有一个简单的数据框:

@H_502_3@data <- data.frame(ID = rep(c("a","b"),each = 500),time = 1:500,val = rnorm(1000,mean=1,sd = 0.3))

我们有2个人的数据(@H_502_3@ID == @H_502_3@a和@H_502_3@b)。我们想对单个@H_502_3@b的数据进行子集处理,并使用@H_502_3@val和@H_502_3@data_point分别绘制@H_502_3@dplyr与@H_502_3@ggplot2的散点图:

@H_502_3@library(ggplot2)
library(dplyr)
data%>%
  filter(ID == "b")%>%
  mutate(data_point = c(1:500))%>%
  ggplot(.,)+
    geom_point(aes(x=data_point,y=val),size = 0.5)

enter image description here

现在,我们要使单个数据点(例如,第一个数据点/行)比其余数据点大,并使用不同的颜色。我们如何才能从此管道内部执行此操作,而不必在管道外部创建对象?

解决方法

您可以在管道内创建两个变量,一个用于突出显示颜色,另一个用于其大小。

library(ggplot2)
library(dplyr)

data %>%
  filter(ID == "b") %>%
  mutate(data_point = 1:500) %>%
  mutate(highlight = data_point == 1,size = 0.5 + 10*highlight) %>%
  ggplot(aes(x = data_point,y = val)) +
  geom_point(aes(color = highlight,size = size),show.legend = FALSE) +
  scale_color_manual(values = c("black","red"))

另一种无需创建这两个变量的方法是将相同的逻辑应用于geom_point中的美学调用。

data %>%
  filter(ID == "b") %>%
  mutate(data_point = 1:500) %>%
  ggplot(aes(x = data_point,y = val)) +
  geom_point(aes(color = data_point == 1,size = 0.5 + 10*(data_point == 1)),"red"))

两种情况下的结果如下。

enter image description here

编辑

感谢@Allan Cameron在comment中指出:

在第一个版本中,您只需要一个新变量,然后 使用scale_size

结果几乎相同,突出显示点的size相差0.5。

data %>%
  filter(ID == "b") %>%
  mutate(data_point = 1:500) %>%
  mutate(highlight = data_point == 1) %>%
  ggplot(aes(x = data_point,size = highlight),"red")) +
  scale_size_manual(values = c(0.5,10*highlight))
,

您可以在mutate()内创建另一列来处理磅值。在此示例中,sizing_point是从5开始的向量,后跟数字0.5,重复nrow(.)-1次,在这种情况下为499次。

 #multiple columns can be defined in mutate() separated by a comma
 data %>% 
      filter(ID == "b") %>%
      mutate(sizing_point = c(5,rep(0.5,nrow(.)-1)),data_point = c(1:500))%>%
      ggplot(.,)+
      geom_point(aes(x=data_point,y=val,size= sizing_point)

您可以突出显示其他当然的观点。假设您想强调第75点。这是一个如何指定该项目的磅值的示例。

  #repeats .05 74 times,followed by 5,then repeats 0.5 again to the end of the vector
  c(rep(0.5,74),5,nrow(.)-75))

并向突出显示的位置添加颜色:

data %>% 
  filter(ID == "b") %>%
  mutate(sizing_point = c(5,data_point = c(1:500))%>%
  ggplot(.,)+ geom_point(aes(x=data_point,size= sizing_point,color=factor(sizing_point)))+
  scale_color_manual(values = c("black","red"))