2016-10-12 5 views
0

У меня есть данные со следующими столбцами: лот, подт, размер, данные. У меня есть несколько лотов (лотов), и каждая партия может иметь несколько подслоев. Каждый Подлот имеет размер (ы) от 1 до 4.Динамическая раскраска boxplot в R

Я создал boxplot для этих данных, используя следующий код:

df <- 
    readXL("Z:/R_Files/example.xlsx", 
    rownames=FALSE, header=TRUE, na="", sheet="Sheet1", 
    stringsAsFactors=TRUE) 

x11() 
par(mar=c(10.1, 5.1, 4.1, 2.1)) 
boxplot(data ~ size*sublot*lot, 
    xlab="", ylab="Data", main="Data by Size, Sublot, Lot", 
    las=2, 
    data=df) 
title(xlab='Size.Sublot.Lot', line=9) 

Я хотел использовать boxfill команду, чтобы цвет каждого boxplot основанный на много#. Я видел два решения:

  1. создать вектор и указать конкретные цвета, которые будут использоваться, например. colr = c («красный», «красный», «красный», «зеленый», «зеленый», «зеленый», «синий»). Проблема с этим решением заключается в том, что он требует, чтобы я знал apriori количество лотов в df и количество раз, которое цвет нужно повторять.
  2. инструкция "ifelse". Проблема с этим решением заключается в том, что (а) мне нужно знать количество лотов и (б) мне нужно создать несколько вложенных операторов ifelse.

Я бы предпочел создать «динамическое» решение, которое создает цветной вектор, основанный на количестве записей лота, которые у меня есть в моем файле.

Я попытался создать:

uniqlot <- unique(df$lot) 
colr <- palette(rainbow(length(uniqlot))) 

, но я застрял, так как записи в векторе Colr не повторяйте за количество уникальных комбинаций size.sublot.lot. Примечание. Я хочу, чтобы все ящики для партии ABC были окрашены одним цветом, все ящики для партии DEF были окрашены другим цветом и т. Д.

Я прикрепляю изображение неокрашенного квадратного ящика. Uncolored Boxplot

Сырые данные (example.xlsx) можно получить по следующей ссылке: example.xlsx

+1

Это легче помочь, если вы предоставите [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) с образцом входные данные (это не частный файл на вашем компьютере). См. Предоставленную ссылку, чтобы узнать, как это сделать. – MrFlick

+0

Большое спасибо за вашу помощь и указатель. Мне было интересно, как разместить файл xlsx. Я разместил его на диске Google с доступной ссылкой. – VikG

ответ

0

Это то, что я хотел бы сделать:

n1 <- length(unique(df$sublot)) 
n2 <- length(unique(df$size)) 
colr <- palette(rainbow(length(n))) 
colr <- rep(colr, each = n1*n2) 

boxplot(data ~ size*sublot*lot, 
     col = colr, 
     xlab="", ylab="Data", main="Data by Size, Sublot, Lot", 
     las=2, 
     data=df) 

Использование ggplot:

df$size <- as.factor(df$size) 

ggplot(df, aes(sublot, data, group = interaction(size, sublot), col = size)) + 
    geom_boxplot() + 
    facet_wrap(~lot, nrow = 1) 

enter image description here

Кроме того, вы можете избавиться от df$size <- as.factor(df$size), если хотите непрерывный цвет.

+0

Вау - спасибо!Я не использовал ggplot и пытался сделать это в базовом R-пакете. Это работает. Я не нашел пакет ggplot, но установил ggplot2. – VikG

+0

@VikG Другая ошибка. Виноват. Предполагается, что это ggplot2. Вы также можете сделать это с базовым пакетом R. 'data ~ size * sublot * lot' создает 16 (4 размера * 4 подм.)« ящиков »для каждой партии, поэтому вам просто нужно повторить каждый цвет 16 раз, что делается с помощью первых четырех строк. – parksw3

+0

Упс - нажмите слишком рано. Один запрос на это - график показывает только номер партии вдоль оси x - в то время как ящики предназначены для комбинаций lot.sublot.size. Как мне получить ось x, чтобы также показать лот.sublot.size вдоль оси x? Я попробовал отредактировать код выше, чтобы сказать ... aes (lot.sublot ... и ... aes (lot * sublot ... но оба ошибки. Опять же - спасибо за вашу помощь. – VikG

0

благодаря указателям, указанным в ответах, и после того, как выкапывали немного больше, я смог найти решение своего вопроса. Я хотел представить этот фрагмент кода в случае, если кто-то должен был реплицироваться.

Вот изображение boxplot, которое этот код создает (и я хотел создать). colored boxplot

df <- 
     readXL("Z:/R_Files/example.xlsx", 
     rownames=FALSE, header=TRUE, na="", sheet="Sheet1", 
     stringsAsFactors=TRUE) 

unqlot <- unique(df$lot) 
unqsublot <- unique(df$sublot) 
unqsize <- unique(df$size) 
cul  <- palette(rainbow(length(unqlot))) 
culur  <- character() 

for (i in 1:length(unqsize)) { 
    culur_temp = rep(cul[i], each=(length(unqsize)*length(unqsublot))) 
    culur = c(culur, culur_temp) 
} 

par(mar=c(10.1, 5.1, 4.1, 2.1)) 
boxplot(data ~ size*sublot*lot, 
    xlab="", ylab="Data", main="Data by Size, Sublot, Lot", 
    col = culur, 
    las=2, 
    data=df) 
Смежные вопросы