Создание гистограммы с несколькими рядами данных с использованием multhist в R

Я хочу создать гистограмму с несколькими рядами данных на одном графике. Лучший способ, который я могу найти, это multhist(). Хотелось бы сюжет в стиле, похожем на hist(), и хотя ggplot() тоже можно использовать для выполнения этой задачи, стиль графики не тот, что мне нужен.

Вот некоторые примеры данных:

df <- structure(list(year = c(2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 
2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 
2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2012L, 
2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
2012L, 2012L, 2012L), count = c(187L, 199L, 560L, 1000L, 850L, 
400L, 534L, 911L, 390L, 1008L, 1173L, 1222L, 810L, 950L, 752L, 
1125L, 468L, 710L, 290L, 670L, 855L, 614L, 1300L, 950L, 670L, 
888L, 490L, 557L, 741L, 700L, 954L, 378L, 512L, 780L, 951L, 398L, 
1544L, 903L, 769L, 1399L, 1021L, 1235L, 1009L, 1222L, 255L)), .Names = c("year", 
"count"), class = "data.frame", row.names = c(NA, -45L))

И вот код, который я использовал до сих пор:

require(plotrix)
d2011<-df$count[df$year=="2011"]
d2012<-df$count[df$year=="2012"]
year<-list(d2011,d2012)
mh <- multhist(year, xlab="Count", ylab="Frequency", main="", cex.axis=1, col=c("dark gray", "light gray"), breaks=seq(0,1600, by=200))
box(bty="l", col="black")
legend.text<-c("2011","2012")
legend(locator(1), legend=legend.text, col=c("dark gray", "light gray"), pch=15, bty="n", cex=0.8)

Это дает мне мультигистограмму в стиле гистограммы, но у меня возникают проблемы с изменением двух параметров графика.

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

  2. Я хотел бы изменить ось X, чтобы деления оси присутствовали между полосами на графике, а текст оси был выровнен с делениями, а не располагался в середине полосы. Я пытался использовать axis(side=1, …), но, поскольку multhist использует объекты списка для создания графиков, эти команды не работают.

Любые предложения будут ценны. Предложения по другим полезным графическим пакетам, которые могут строить гистограммы с несколькими наборами данных, также будут приветствоваться.


person Emily    schedule 26.07.2013    source источник
comment
Знаете ли вы, что вы можете изменить стиль графики (используя themes) в ggplot2?   -  person Roland    schedule 26.07.2013
comment
@ Роланд, спасибо за комментарий. Раньше у меня были проблемы с темами в ggplot2, но, возможно, пришло время вернуться к ним! Спасибо. Было бы еще здорово разобраться, как настроить сюжет в multhist, если кто-нибудь знает простой способ сделать это.   -  person Emily    schedule 26.07.2013


Ответы (2)


Прочитайте документацию barplot, чтобы понять, как указать нулевое пространство:

multhist(year, xlab="Count", ylab="Frequency", main="", 
         cex.axis=1, col=c("dark gray", "light gray"), 
         breaks=seq(0,1600, by=200),
         space=c(0,0), beside=TRUE)

введите здесь описание изображения

Вот пример с ggplot2 и theme_bw:

library(ggplot2)

ggplot(df, aes(x=count,group=year,fill=as.factor(year))) + 
  geom_histogram(position="identity", alpha=0.5, breaks=seq(0,1600, by=200),right=TRUE) +
  scale_fill_discrete(name="Year") +
  theme_bw(base_size=20) +
  xlab("values")

введите здесь описание изображения

Или, если вы действительно хотите, как сюжет из multhist (который не так легко интерпретировать):

ggplot(df, aes(x=count,group=year,fill=as.factor(year))) + 
  geom_histogram(position="dodge", breaks=seq(0,1600, by=200),right=TRUE) +
  scale_fill_discrete(name="Year") +
  theme_bw(base_size=20) +
  xlab("values") +
  scale_x_continuous(breaks=seq(100,1500, by=200))

введите здесь описание изображения

person Roland    schedule 26.07.2013
comment
@ Роланд, спасибо за ответ. ggplot2 кажется хорошим пакетом для такого типа гистограмм. Я также хотел бы решить проблемы с мультилистом, но, возможно, это невозможно с таким типом сюжета! - person Emily; 26.07.2013
comment
@Emily Добавлено, как изменить пробел в multhist. - person Roland; 26.07.2013
comment
Фантастика, спасибо. Провел целую вечность, просматривая справку по барплоту, и не мог ее найти! - person Emily; 26.07.2013

Для наложенных гистограмм я предпочитаю использовать графики плотности. Они приятнее для глаз, особенно если у вас более тонкие корзины и больше ящиков. С вашими данными можно было бы получить это.

ggplot(df, aes(x=count,group=year,fill=as.factor(year))) + 
  geom_density(position="identity", alpha=0.5, breaks=seq(0,1600, by=200),right=TRUE) +
  scale_fill_discrete(name="Year") +
  theme_bw() +
  xlab("values")

график плотности

person dmvianna    schedule 03.10.2013
comment
Спасибо за этот пример. Я нахожу это действительно полезным! Хотел спросить, какие единицы измерения используются для плотности (ось Y)? - person pogibas; 09.12.2013
comment
@Pgibas Кривая является результатом преобразования каждой точки данных в нормальное распределение, а затем суммирования их всех вместе, , как объяснялось. здесь. Если вы найдете простой способ объяснить его единицу измерения, я тоже хотел бы узнать об этом.. XD - person dmvianna; 09.12.2013