如何使用ggplot突出小平面网格中的点?

时间:2017-07-29 09:00:23

标签: r ggplot2 facet

我有长篇形式的以下数据:

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

结果如下: plot

我现在想用不同的颜色突出显示每个子图的一个点。我无法弄清楚如何将其添加到当前geom_point,是否可能?

例如,如何突出显示第一个子图中的最大值和其他两个子图中的最小值?像这样,第一个: plot

我找到了一种方法,用三个独立的图表手动完成,然后将它们连接到一个网格中,但是这个解决方案是25行,并且有很多重复的代码。有没有办法通过稍微修改上面的代码片段来做到这一点?

(顺便说一句,最小值和最大值分别为which.min(df$value[df$variable == 'cp'])等)

1 个答案:

答案 0 :(得分:1)

您可以添加一列来标记每个构面中的最大值或最小值。下面的代码添加了一列,用于标记线性回归拟合具有正斜率的面中的最大值,以及当斜率为负时的最小值。然后将添加的列映射到颜色美学以设置点颜色。 (您还可以通过将新列分别映射到sizeshape美学来使突出显示的点更大和/或为它们使用不同的点标记。)

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

enter image description here

您可以通过直接将数据框连接到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()