Несколько гистограмм в ggplot2 - PullRequest
11 голосов
/ 01 июня 2011

Вот короткая часть моих данных:

dat <-structure(list(sex = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("male", 
"female"), class = "factor"), A = c(1, 2, 0, 2, 1, 2, 2, 0, 2, 
0, 1, 2, 2, 0, 0, 2, 0, 0, 0, 2), B = c(0, 0, 0, 0, 0, 2, 0, 
0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0), C = c(1, 2, 1, 0, 0, 
2, 1, 1, 0, 1, 1, 0, 1, 2, 1, 2, 0, 2, 1, 2), D = c(2, 2, 0, 
2, 2, 2, 1, 0, 1, 1, 1, 0, 1, 2, 0, 0, 1, 1, 1, 0), E = c(0, 
0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 2, 2), F = c(2, 
2, 1, 2, 1, 2, 2, 0, 1, 2, 0, 1, 2, 2, 0, 1, 2, 2, 2, 2)), .Names = c("sex", 
"A", "B", "C", "D", "E", "F"), variable.labels = structure(c("sex", 
"zenuwac", "panieke", "gespann", "rustelo", "angstig", "onzeker"
), .Names = c("sex", "anx01", "anx02", "anx03", "anx04", "anx05", 
"anx06")), codepage = 20127L, row.names = c(NA, 20L), class = "data.frame")

Фрейм данных с оценками мужчин и женщин по шести 3-балльным переменным. Теперь я хочу создать график, который показывает гистограммы баллов каждой переменной как у мужчин, так и у женщин в сетке. Например, я могу сделать:

layout(matrix(1:12,6,2,byrow=TRUE))
par(mar=c(2,1,2,1))
for (i in 1:6) for (s in c("male","female")) hist(dat[dat$sex==s,i+1],main=paste("item",names(dat)[i+1],s))

, что приводит к:

Histogram with base R graphics

Я мог бы сделать это лучше, но мне больше интересно узнать, как использовать ggplot2. Итак, мой вопрос, как мне создать красивую версию этого с помощью ggplot2? Одна вещь, которую я получил, это:

library("ggplot2")
grid.newpage()
pushViewport(viewport(layout = grid.layout(6, 2)))   
for (s in 1:2)
{
    for (i in 1:6)
    {
        p <- qplot(dat[dat$sex==c("male","female")[s],i+1]+0.5, geom="histogram", binwidth=1)
        print(p, vp = viewport(layout.pos.row = i, layout.pos.col = s))
    }
}

Но я думаю, что есть гораздо более простой способ сделать это?

Ответы [ 2 ]

16 голосов
/ 01 июня 2011

Вы можете попробовать grid.arrange() из пакета gridExtra ; т.е. сохраняйте свои графики в списке (скажем, qplt) и используйте

do.call(grid.arrange, qplt)

Другие идеи: используйте фасетирование в ggplot2 (sex*variable), учитывая data.frame (используйте melt).

В качестве обозначения было бы лучше использовать столбчатую диаграмму с накоплением или точечный график Кливленда для отображения частот отклика элементов, ИМО. (Я дал несколько идей о CrossValidated .)


Для полноты картины вот некоторые идеи реализации:

# simple barchart
ggplot(melt(dat), aes(x=as.factor(value), fill=as.factor(value))) + 
  geom_bar() + facet_grid (variable ~ sex) + xlab("") + coord_flip() + 
  scale_fill_discrete("Response")

enter image description here

my.df <- ddply(melt(dat), c("sex","variable"), summarize, 
               count=table(value))
my.df$resp <- gl(3, 1, length=nrow(my.df), labels=0:2)

# stacked barchart
ggplot(my.df, aes(x=variable, y=count, fill=resp)) + 
  geom_bar() + facet_wrap(~sex) + coord_flip()

enter image description here

# dotplot
ggplot(my.df, aes(x=count, y=resp, colour=sex)) + geom_point() + 
  facet_wrap(~ variable)

enter image description here

4 голосов
/ 01 июня 2011

Чтобы продолжить на примере chl - вот как скопировать базовый рисунок с помощью ggplot. Я бы прислушался к его совету и по точечным графикам:

library(ggplot2)
dat.m <- melt(dat, "sex") 

ggplot(dat.m, aes(value)) + 
  geom_bar(binwidth = 0.5) + 
  facet_grid(variable ~ sex)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...