2017-07-29 69 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

相關問題