我有长篇形式的以下数据:
data <- '"","n","variable","value"
"1",1,"adjr2",0.0365013693015789
"2",2,"adjr2",0.0514307495746085
"3",3,"adjr2",0.0547096973547058
"4",4,"adjr2",0.0552737311430782
"5",5,"adjr2",0.0552933455488706
"6",6,"adjr2",0.0552904097804204
"7",1,"cp",631.119186022639
"8",2,"cp",132.230096988504
"9",3,"cp",23.4429422708563
"10",4,"cp",5.55840294833615
"11",5,"cp",5.9017131979017
"12",6,"cp",7
"13",1,"bic",-1156.56144387716
"14",2,"bic",-1641.2046046544
"15",3,"bic",-1741.38235791823
"16",4,"bic",-1750.90145310605
"17",5,"bic",-1742.19643112204
"18",6,"bic",-1732.73634326858'
df <- read.csv(text=data)
我想为每个变量创建一个点图。目前,我正在使用ggplot2
:
ggplot(df) + geom_point(aes(x = n, y = value, fill = variable)) +
facet_grid(variable ~ ., scale="free_y")
我现在想用不同的颜色突出显示每个子图的一个点。我无法弄清楚如何将其添加到当前geom_point
,是否可能?
例如,如何突出显示第一个子图中的最大值和其他两个子图中的最小值?像这样,第一个:
我找到了一种方法,用三个独立的图表手动完成,然后将它们连接到一个网格中,但是这个解决方案是25行,并且有很多重复的代码。有没有办法通过稍微修改上面的代码片段来做到这一点?
(顺便说一句,最小值和最大值分别为which.min(df$value[df$variable == 'cp'])
等)
答案 0 :(得分:1)
您可以添加一列来标记每个构面中的最大值或最小值。下面的代码添加了一列,用于标记线性回归拟合具有正斜率的面中的最大值,以及当斜率为负时的最小值。然后将添加的列映射到颜色美学以设置点颜色。 (您还可以通过将新列分别映射到size
和shape
美学来使突出显示的点更大和/或为它们使用不同的点标记。)
library(dplyr)
df = df %>%
group_by(variable) %>% # Group by the faceting variable
mutate(highlight = coef(lm(value ~ n))[2], # Get slope for each facet
highlight = ifelse(highlight > 0, # Mark max or min value, depending on slope
ifelse(value==max(value),"Y","N"),
ifelse(value==min(value),"Y","N")))
ggplot(df) +
geom_point(aes(x = n, y = value, colour=highlight), size=2, show.legend=FALSE) +
facet_grid(variable ~ ., scale="free_y") +
scale_colour_manual(values=c("black","red")) +
theme_bw()
您可以通过直接将数据框连接到ggplot而不是首先保存更新的数据框,而无需将新列永久添加到数据框中来执行此操作:
df %>%
group_by(variable) %>%
mutate(highlight = coef(lm(value ~ n))[2],
highlight = ifelse(highlight > 0,
ifelse(value==max(value),"Y","N"),
ifelse(value==min(value),"Y","N"))) %>%
ggplot() +
geom_point(aes(x=n, y=value, colour=highlight), size=2, show.legend=FALSE) +
facet_grid(variable ~ ., scale="free_y") +
scale_colour_manual(values=c("black","red")) +
theme_bw()