2014-01-26 56 views
2

使用這些數據手動更改線型秩序和ggplot抵消誤差條

Data <- structure(list(value = c(180, 528, 180, 147, 468, 151, 194, 568, 
210), SE = c(21.7869586486209, 21.0831764730322, 21.2726560659361, 
21.7869586486209, 21.0831764730322, 21.2726560659361, 21.7869586486209, 
21.0831764730322, 21.2726560659361), PredictionType = c("InSitu", 
"ExSitu", "ExSitu", "ExSitu", "InSitu", "ExSitu", "ExSitu", "ExSitu", 
"InSitu"), Area = c("AAA", "BBB", "CCC", "AAA", "BBB", "CCC", 
"AAA", "BBB", "CCC")), .Names = c("value", "SE", "PredictionType", 
"Area"), class = "data.frame", row.names = c(NA, -9L)) 

和下面的代碼,我可以產生下面的情節。

ggplot(Data)+ 
    geom_point(aes(x=Area, y=value, color=Area),size=3, shape=1)+ 
    geom_errorbar(aes(x=Area, ymin=value-SE, ymax=value+SE, color=Area, linetype = PredictionType),cex=0.75) 

enter image description here

線型被ExSitu和原位預測之間正確區分,但我想要的線路類型被逆轉。毫不誇張地說,我希望虛線是ExSitu,實線是InSitu。

此外,是否有可能偏移錯誤欄,使它們不直接在彼此之上?理想情況下,我希望固體InSitu估計集中在該區域(AAA,BBB,CCC)和兩個虛線ExSitu估計稍微偏左和居中。

在此先感謝。

回答

2

您可以使用position參數偏移(閃避)點和誤差線(見例如here)。但是,在每個「區域」中有多個具有相同「PredictionType」的點/誤差欄,並且需要爲Area內的每個點創建一個具有唯一值的新變量,以便進行工作。這裏我使用ave來創建虛擬變量。我'借用'一個未使用的aes thetics,fill,爲躲避,然後刪除填充圖例。使用linetype的順序在scale_linetype_manual中更改。

Data$id <- with(Data, ave(Area, Area, FUN = seq_along)) 
dodge <- position_dodge(width = 0.4) 

ggplot(Data, aes(x = Area, y = value, fill = id, colour = Area, linetype = PredictionType)) + 
    geom_point(size = 3, shape = 1, position = dodge) + 
    geom_errorbar(aes(ymin = value - SE, ymax = value + SE), 
       cex = 0.75, position = dodge) + 
    scale_linetype_manual(values = c("dotted", "solid")) + 
    scale_fill_discrete(guide = FALSE) 

enter image description here

更新以下注釋:

爲了放置「原位」點在中間,一種可能性是設置id變量爲2「原位」數據,以及1和3分別爲 'ExSitu' 數據:

Data <- Data[order(Data$Area, Data$PredictionType), ] 
Data$id <- as.character(c(1, 3, 2)) 

ggplot(Data, aes(x = Area, y = value, fill = id, colour = Area, linetype = PredictionType)) + 
    geom_point(size = 3, shape = 1, position = dodge) + 
    geom_errorbar(aes(ymin = value - SE, ymax = value + SE), 
       size = 1, width = 0.5, position = dodge) + 
    scale_linetype_manual(values = c("dotted", "solid")) + 
    scale_fill_discrete(guide = FALSE) 

enter image description here

+0

謝謝@亨利克。是否有可能控制閃避,因此實線始終位於BBB區域的中心? –

+1

@ B.Davis,請參閱我的更新回答。 – Henrik

1

ggplot將PredictionType強制爲一個因子,然後按照該級別出現的順序將該因子的每個級別分配給一個線型。默認情況下首先放置ExSitu,所以你可以通過幾種方式解決這個問題。

首先,你可以PredictionType轉換成因子自己,並分配水平要直接:

Data$PredictionType = factor(Data$PredictionType,levels=c('InSitu','ExSitu')) 

或者,你可以調用轉換是正確的,當你把它給ggplot(儘管你可能需要改變圖例標題):

ggplot(Data)+ 
geom_point(aes(x=Area, y=value, color=Area),size=3, shape=1)+ 
geom_errorbar(aes(x=Area, ymin=value-SE, ymax=value+SE, color=Area, linetype = factor(PredictionType,levels=c('InSitu','ExSitu'))),cex=0.75)