2016-08-03 8 views
1

Мне интересно, как я могу создать ящики с двумя разными цветами внутри коробки. Например, моя переменная d, которую я набрасываю, представляет собой сумму переменных b и c. Таким образом, в каждой коробке цвет может указывать пропорцию переменной b и c, создавая d. Надеюсь, это понятно.R раскраски в коробке из-за переменных (уложенная коробка)

Вот мой пример:

a<-c("A","A","B","B","B","C","C","C","B","A") 
    b<-c(1,2,3,4,3,4,5,6,3,4) 
    c<-c(5,6,4,5,2,1,2,1,5,8) 
    d<-c(6,8,7,9,5,5,7,7,8,12) 
    df<-data.frame(a,b,c,d) 

    boxplot(d~a) 

Теперь я хотел бы окрасить каждую коробку в соответствии с переменной Ь и с, так что доля указывается.

Вот изображение, которое показывает сюжет, который был сделан с помощью Excel. example http://www.real-statistics.com/wp-content/uploads/2012/11/box-plot-excel.png

У вас есть идеи, как достичь этого? Спасибо!

+0

Является ли граница между фиолетовым и зеленым * также * расположение медианы? – tluh

+0

В моем случае это не обязательно так, поэтому у меня будет дополнительная строка, показывающая медиану – KikiRiki

+1

. Это делает ИМО бессмысленным. Пожалуйста, прочитайте '? Boxplot' и какие данные будут показаны с этим графиком. В вашем примере 'df' поле boxplot варьируется от 7 до 10 для' A'. Что будет для 'b' и' c'? – Jimbou

ответ

1

Вы можете попробовать:

# First the boxplot 
n <- boxplot(d ~ a) 
# check the x values for the boxes, here it is for A 0.6 and 1.4 
axis(1, seq(0, 5, 0.1)) 

# proportions for the b values depended on a 

# the mean values calculated using another approach you mentioned in the comment 
ratio <- aggregate(df[ , -1], list(df$a), mean) 
# get the percentages 
ratio <- ratio$b/ratio$d 

# your approach: 
ratio <- c(by(df, INDICES = df$a, FUN = function(x) mean(x$b/x$d))) 
ratio  
A   B   C 
0.2500000 0.4620040 0.7904762 

# caculate the y values for the rectangles, no matter which mean-calculation method you used 
low <- diff(n$stats[c(2, 4), ])*ratio 
high <- diff(n$stats[c(2, 4),])*(1-ratio) 

# the final plot 
n <- boxplot(d ~ a) 
rect(xleft = c(0.6) + seq_along(n$n)-1, xright = 1.4 + seq_along(n$n)-1, ybottom = n$stats[2, ], ytop = n$stats[2, ]+low, col = rgb(1, 1,0 ,0.4)) 
rect(xleft = c(0.6) + seq_along(n$n)-1, xright = 1.4 + seq_along(n$n)-1, ybottom = n$stats[4, ], ytop = n$stats[4, ]-high, col = rgb(0, 1, 1, 0.4)) 

Идея состоит в том, чтобы построить прямоугольники в боксы с помощью rect(). Вы должны указать значения x и y для начала и конца, соответственно. Вы легко можете прочитать x-значения из boxplot, добавив дополнительную непрерывную ось x, используя axis. Значение y зависит от соотношения b и c по сравнению с d. Таким образом, вы вычисляете отношение для одного вектора (здесь b) с использованием aggregate или by и генерируете значение y в пределах rect(). Наконец, функция rgb() вычисляет цвет, добавляющий альфа-параметр для прозрачности.

enter image description here