2013-04-01 26 views
1

我在R中有幾個箱子和鬍鬚圖。在這兩個座標系中,x軸對應於一個分類變量,而分組顏色對應於另一個。R ggplot - 座標變換(平方根)與箱形圖

如果我繪製兩個繪圖與未轉換的y軸,他們都很好。但是,如果我嘗試對y軸進行平方根變換(使用:coord_trans(y =「sqrt」)),那麼其中一個圖形仍然正常,而另一個圖形在大多數框中會刪除對應於中值的行因爲只有兩組,因此盒子稍寬一點,請參見第一幅圖上的「數字」1和2)。此外,對於沒有正確繪製的圖形,如果我減少x軸上的類別數(因此再次使框變寬),中線再次出現。

這是一個coord_trans(如果是的話,我怎麼能解決它)或我的代碼有問題?

非常感謝您的任何建議。

library(car) 
library(gplots) 
library(plyr) 
library(ggplot2) 
library(gridExtra) 
library(gdata) 

Category=factor(c(rep(1, times =3240), rep(2, times =2160)), 
       labels=c("A","B"), levels=c(1,2)) 
ID=factor(rep(seq(from = 1, to = 45),each = 120)) 
Months=factor(rep(seq(from = 1, to = 3), each = 40, times = 45), 
       labels=c("Jan","Feb","Mar"),levels=c(1:3)) 
Obs=rnorm(5400, mean=25, sd=15) 
Data=data.frame(Category,ID,Months,Obs) 

Data=subset(Data, (Data$Category=="B") | !(Data$ID%in%c(1,2)) | 
       (Data$Months%in%c("Jan","Feb"))) 

for (j in 1:2) 
{ 
    sel=which(Data$Category==unique(levels(Data$Category))[j]) 
    Observ=Data$Obs[sel] 
    Month=Data$Months[sel] 
    Number=droplevels(Data$ID[sel]) 
    Number=droplevels(Number) 
    Data_used=data.frame(Number,Month,Observ) 
    plot1 = ggplot(Data_used, aes(Number, Observ)) + 
    geom_boxplot(aes(fill=Month, drop=FALSE), na.rm=TRUE) + 
    scale_y_continuous(breaks = c(0,20,40,60,80,100), limits=c(0,115)) + 
    coord_trans(y = "sqrt") 
    plot(plot1) 
} 
+3

很難在沒有數據的情況下幫助您,或者至少在您顯示問題的地方顯示圖片。 – agstudy

+0

對不起。添加數據 –

+0

用'scale_y_sqrt()'替換'scale_y_continuous()'並丟失'coord_trans()'行。這似乎適用於我(R-2.15.3,Win7 64位,ggplot2-0.9.3.1)。 – Dennis

回答

0

@Dennis在他的評論中是正確的,scale_y_sqrt()會糾正這一點。因爲中位數和四分位數是順序統計數據,所以在計算數據之前或之後轉換數據並不重要。

+1

我同意中位數和四分位數不受影響。然而,盒子的「鬍鬚」和異常值將受到影響。異常值被定義爲遠離Q1和Q3的距離超過四分位距離的1.5倍。用'scale_y_sqrt()'來計算距離將在平方根範圍內計算。使用'coord_trans()'它將在未轉換的比例上計算,這就是我所追求的。 –

+0

要查看我的意思,請參閱以下代碼: –

+0

注意:固定「隨機」數據的種子 ID = factor(rep(1,80)) Months = factor(rep(seq(from = 1,to =每個= 40), labels = c(「Jan」,「Feb」),levels = c(1:2)) set.seed(33) Obs = abs(rnorm(80,mean = 25) (數據,月份,觀察值) Data = data.frame(ID,Months,Obs) Observ = Data $ Obs Month = Data $ Months Number = Data $ ID Data_used = data.frame (數字,Observ))+ geom_boxplot(aes(fill = Month,drop = FALSE),na.rm = TRUE)+ #scale_y_continuous(breaks = c(0,20,60,100) ,限制(plot1)s = c(0,115))+ coord_trans(y =「sqrt」) scale_y_sqrt(breaks = c(20,60,100),limits = c(0,115)) plot –