如何解决使用从管道创建的ggplot高亮单个数据点
我们有一个简单的数据框:
data <- data.frame(ID = rep(c("a","b"),each = 500),time = 1:500,val = rnorm(1000,mean=1,sd = 0.3))
我们有2个人的数据(ID
== a
和b
)。我们想对单个b
的数据进行子集处理,并使用val
和data_point
分别绘制dplyr
与ggplot2
的散点图:
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)
现在,我们要使单个数据点(例如,第一个数据点/行)比其余数据点大,并使用不同的颜色。我们如何才能从此管道内部执行此操作,而不必在管道外部创建对象?
解决方法
您可以在管道内创建两个变量,一个用于突出显示颜色,另一个用于其大小。
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"))
两种情况下的结果如下。
编辑
感谢@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"))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。