R ggplot-坐标变换(平方根)与箱线图

R ggplot-坐标变换(平方根)与箱线图,r,ggplot2,boxplot,R,Ggplot2,Boxplot,我在R中有两个方块和胡须图。在这两个图中,x轴对应一个分类变量,而分组颜色对应另一个 如果我用未转换的y轴绘制两个图,它们都很好。但是,如果我尝试使用:coord_transy=sqrt对y轴进行平方根变换,其中一个图形仍然很好,而另一个图形会在大多数框中删除与中值相对应的线,但只有两个组的框除外,因此框稍宽,请参见第一个图中的数字1和2。此外,对于不能正确绘制的图形,如果我减少x轴上的类别数量,从而使框再次变宽,则中间线再次出现 这是coord_trans的一个bug吗?如果是,我如何避免它,

我在R中有两个方块和胡须图。在这两个图中,x轴对应一个分类变量,而分组颜色对应另一个

如果我用未转换的y轴绘制两个图,它们都很好。但是,如果我尝试使用:coord_transy=sqrt对y轴进行平方根变换,其中一个图形仍然很好,而另一个图形会在大多数框中删除与中值相对应的线,但只有两个组的框除外,因此框稍宽,请参见第一个图中的数字1和2。此外,对于不能正确绘制的图形,如果我减少x轴上的类别数量,从而使框再次变宽,则中间线再次出现

这是coord_trans的一个bug吗?如果是,我如何避免它,或者我的代码有问题

非常感谢你的建议

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)
}

@丹尼斯的评论是正确的,他认为scale_y_sqrt会纠正这一点。因为中位数和四分位数是顺序统计数据,所以无论数据是在计算之前还是之后进行转换都无关紧要。

如果没有数据或至少没有显示问题的图片,很难为您提供帮助。将scale_y_continuous替换为scale_y_sqrt,并失去坐标转换线。这似乎适合我R-2.15.3,Win7 64位,ggplot2-0.9.3.1。谢谢你的建议。然而,我已经试过了,它并没有真正做到我想要的。据我所知,scale_y_sqrt在绘制之前对所有数据进行变换,以便中值和四分位数是变换后的比例。我所追求的是四分位数按原始比例计算,但按平方根比例绘制,这就是我认为coord_trans应该做的。我同意中位数和四分位数不受影响。但是,箱线图的胡须和异常值将受到影响。离群值定义为距Q1和Q3的距离大于四分位间距的1.5倍。使用scale_y_sqrt,该距离将以平方根比例计算。使用coord_trans,它将在未转换的刻度上进行计算,这是我所追求的。注意:随机数据的种子固定ID=factorrep1,80个月=factorrepseqfrom=1,to=2,每个=40,标签=cJan,二月,级别=c1:2集。种子33 Obs=absrnorm80,平均值=25,sd=15数据=数据。frameID,月,Obs Observ=Data$Obs Month=Data$Month Number=Data$ID Data\u used=Data.frameNumber,Month,Observ plot1=ggplotData\u used,aesNumber,Observ+geom\u boxplotaesfill=Month,drop=FALSE,na.rm=TRUE+scale\u y\u continuousbreaks=c0,20,60100,limits=c0115+coord\u transy=sqrt scale\u y\u sqrtbreaks=c20,60100,limits=c0115 plot1