2017-07-29 71 views
1

,我有以下数据中长型:如何用ggplot突出显示一个方面网格中的点?

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

你可以添加一列,以纪念在各方面的最大值或最小值。下面的代码添加一列以标记线性回归拟合具有正斜率的方面中的最大值和斜率为负值时的最小值。然后将此添加的列映射到颜色审美以设置点颜色。 (你也可以制造更大的高亮显示的点和/或新列映射到分别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() 
+0

谢谢,这正是我一直在寻找,这真的浓伊势! dplyr和ggplot的表现力非常惊人,我有很多东西需要学习! – rubik

相关问题