2015-01-03 3 views
2

Я использую RStudio Version 0.98.1028 на окнах. Я хочу сделать многоуровневую гистограмму с помощью ggplot2. Скажем, у меня есть 4D кадр данных, как это:Создание интеллектуальных многоуровневых гистограмм

facet <- as.factor(rep(c('alpha', 'beta', 'gamma'), each = 4, times = 3)) 
group <- as.factor(rep(c('X', 'Y'), each = 2, times = 9)) 
type <- as.factor(rep(c('a', 'b'), each = 1, times = 18)) 
day <- as.factor(rep(1:3, each = 12) 

df = data.frame(facet = facet, group = group, type = type, day = day, value = abs(rnorm(36))) 

Я хотел бы сделать гистограммы x = day против y = value в 3-х граней, соответствующих facet, группировка по group и наполнению type. Другими словами, я хотел бы накапливать a и b в одном баре, но сохраняя раздельные полосы для X и Y. Это будет выглядеть примерно так

g = ggplot(df, aes(day, value, group = group, fill = type)) 
g + geom_histogram(stat = 'identity', position = 'dodge') + 
    facet_grid(facet ~ .) 

К сожалению с dodge вариантом я получаю штабели гистограмм, а не я получаю 4 бара на каждый день. Любая идея о том, как решить эту проблему?

Использование первенствовать один аспект должен выглядеть примерно так

enter image description here

Заранее спасибо!

EB

+0

Мне сложно понять, что именно вы ищете - можете ли вы представить картинку диаграммы Excel? – CMichael

+0

Я согласен с @CMichael, было бы легче понять, что вы ищете, если включить фигуру диаграммы Excel ... –

ответ

1

Ну, может быть, ваш вопрос связан с this one on the ggplot group. Возможное решение заключается в следующем:

g = ggplot(df, aes(group, value, fill = type)) 
g + geom_bar(stat = 'identity', position = 'stack') + 
    facet_grid(facet ~ day) 

Это неоптимальным, потому что вы используете два аспекта, но в этом случае вы получите эту цифру: enter image description here

+0

Почти! Только я хотел бы иметь только три основных аспекта! – Emiliano

+0

Я думаю, что вы можете только попытаться «скрыть» дневную грань, удаляя белые пробелы и метки в этот момент ... –

1

Как указывает @Matteo ваши конкретные желания, вероятно, не достигаются непосредственно с помощью инструмента, предоставленного ggplot2. Немного взломанного ниже, что может указывать на правильное направление - я не слишком одобряю его, но я просто провел пару минут, играя с ним. Возможно, вы можете подобрать несколько элементов.

Я объединил группу и день в один фактор, и при построении графика вместо x-меток были заменены именами (неповторимыми). Затем я включил (лениво) дневные ярлыки. Я все еще чувствую, что день x фасет - это то, как вы должны действовать.

df$combinedCategory <- as.factor(paste(df$day,df$group)) 
library(scales) 
g = ggplot(df, aes(combinedCategory, value, fill = type)) 
g = g + geom_bar(stat='identity',position = 'fill') 
g = g + facet_grid(facet ~ .) 
g = g + scale_y_continuous(labels = percent) 
g = g + scale_x_discrete(labels = c("X","Y")) 
g = g + geom_text(aes(x=1.5,y=0.05, label="Day 1")) 
g = g + geom_text(aes(x=3.5,y=0.05, label="Day 2")) 
g = g + geom_text(aes(x=5.5,y=0.05, label="Day 3")) 
g = g + theme_minimal() 
g 

Это дает следующее:

enter image description here

+0

Действительно, достаточно выбрать – Emiliano

0

Действительно, достаточно установить y = interaction(group, day) в aes(). Это был мой первый шаг, но мне было интересно, существует ли что-то более точное. По-видимому, это не так: единственная сложная задача здесь - создать 2-й уровень строк по оси x. Спасибо всем!

+0

Конечно, это ответ на мой вопрос: это именно то, что я спросил для. – Emiliano

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