2016-12-15 49 views
2

我想創建一個折線圖,顯示未檢測到的數據的開放符號和表示檢測到的數據的關閉(填充)符號。下面是一些代碼一起工作:ggplot有條件地改變形狀或形狀填充使用變量

date <- c("1991-04-25","1991-04-26","1991-04-27","1991-04-28","1991-04-29","1991-04-25","1991-04-26","1991-04-27","1991-04-28","1991-04-29","1991-04-25","1991-04-26","1991-04-27","1991-04-28","1991-04-29") 
Parameter <- c("TEA","TEA","TEA","TEA","TEA","COFFEE","COFFEE","COFFEE","COFFEE","COFFEE","WATER","WATER","WATER","WATER","WATER") 
data <- c(5,4,7,3,6,4,6,8,6,3,7,8,7,6,7) 
DetectYN <- c("Y","N","Y","Y","Y","N","Y","Y","Y","N","N","N","Y","Y","N") 

df <- data.frame(date, Parameter,data, DetectYN) 

df$date <- as.Date(df$date, "%Y-%m-%d") 
df$DetectYN <-as.character(df$DetectYN) 

ggplot(df, aes(x=date, y=data)) + 
geom_point(size=4, aes(shape = Parameter , colour= Parameter)) + 
geom_line(aes(x=date, y=data,color = Parameter)) + 
scale_shape_manual(values=ifelse(DetectYN == "Y",c(15,16,17),c(0,1,2)) , guide = "none") 

這在下面的圖表 - 接近正確的,只是我的ifelse沒有預期的效果。我想DetectYN =「N」是空心的(沒有填充),我想要填充DetectYN =「Y」。現有的符號需要保留。有誰能幫我解決這個問題嗎? enter image description here

+1

您的代碼工作對我來說(我得到填補而空點符號的組合)。這是一個錯字嗎?如果你有'values = ifelse(LOC $ DetectYN ==「Y」,c(15,16,17),c(0,1,2))''你的意思是'values = ifelse(DetectYN ==「Y」 ,c(15,16,17),c(0,1,2))'沒有LOC $ – G5W

+0

對不起 - 這是我實際代碼中的一個遺蹟......好吧,我刷新了我的環境,並能夠像你說的那樣重現(謝謝),但這還不完全正確。如果您查看數據框,您會看到例如Coffee,應該有兩個點顯示未檢測到,以及三個顯示已檢測到的點。目前,它們都顯示無法檢測到(假設它正在獲取組中的第一個值)。我編輯了原始代碼以取出'LOC'參考。 @ G5W –

回答

3

這是一個看似難以解決的問題! 這個解決方案直接回答你的問題,並希望有一些用處。但是,我擔心這會對大型複雜的數據集造成混亂。

我添加了一個列,它將兩個想要控制形狀的變量組合起來,然後通過這個新列定義形狀,然後對形狀編號進行排序以獲得所需的結果。

df$shape<-paste(Parameter, DetectYN) 

ggplot(df, aes(x=date, y=data, colour= Parameter)) + 
    geom_point(size=4, aes(shape=shape))+ 
    geom_line() + 
    scale_shape_manual(values=c(0,15,1,16,2,17) , guide = "none") 

enter image description here

+1

一個非常聰明的解決方案!謝謝!同意,它可能會與更大的數據集複雜 - 但這直接幫助我的現實生活中的問題,並應根據您的解決方案容易實施。 –