2013-04-01 3 views
1

У меня есть пара графиков ящиков и усов в R. В обоих случаях ось x соответствует одной категориальной переменной, а цвета группировки соответствуют другой.R ggplot - Преобразование координат (квадратный корень) с boxplot

Если я рисую обе графики с нетрансформированной осью 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_continuous()' на 'scale_y_sqrt()' и потеряйте строку '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 = коэффициент (rep (1,80)) Месяцы = коэффициент (rep (seq (from = 1, to = 2), каждый = 40), labels = c («Jan», «Feb»), levels = c (1: 2)) set.seed (33) Obs = abs (rnorm (80, mean = 25 , с.о. = 15)) данных = data.frame (ID, месяцы, набл) Observ = Данные $ найд месяц = ​​$ Данные месяца Число = Данные $ ID Data_used = data.frame (число, месяц, 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,60,100) , предел s = c (0,115)) + coord_trans (y = "sqrt") scale_y_sqrt (breaks = c (20,60,100), limits = c (0,115)) участок (plot1) –

Смежные вопросы