Здесь мы рассмотрим построение гистограмм с помощью ggplot2 на примере визуализации иммиграции в США за период 1820 - 2006 гг.
Сначала загрузим наш набор данных.
> library(ggplot2)
> df = structure(c(106487, 495681, 1597442, 2452577, 2065141, 2271925, 4735484, 3555352, 8056040, 4321887, 2463194, 347566, 621147, 1325727, 1123492, 800368, 761550, 1359737, 1073726, 36, 53, 141, 41538, 64759, 124160, 69942, 74862, 323543, 247236, 112059, 16595, 37028, 153249, 427642, 1588178, 2738157, 2795672, 2265696, 11951, 33424, 62469, 74720, 166607, 404044, 426967, 38972, 361888, 1143671, 1516716, 160037, 354804, 996944, 1716374, 1982735, 3615225, 4486806, 3037122, 17, 54, 55, 210, 312, 358, 857, 350, 7368, 8443, 6286, 1750, 7367, 14092, 28954, 80779, 176893, 354939, 446792, 33333, 69911, 53144, 29169, 18005, 11704, 13363, 18028, 46547, 14574, 8954, 2483, 14693, 25467, 25215, 41254, 46237, 98263, 185986), .Dim = c(19, 5), .Dimnames = list(c("1820-30", "1831-40", "1841-50", "1851-60", "1861-70", "1871-80", "1881-90", "1891-00", "1901-10", "1911-20", "1921-30", "1931-40", "1941-50", "1951-60", "1961-70", "1971-80", "1981-90", "1991-00", "2001-06"), c("Europe", "Asia", "Americas", "Africa", "Oceania")))
> df = structure(c(106487, 495681, 1597442, 2452577, 2065141, 2271925, 4735484, 3555352, 8056040, 4321887, 2463194, 347566, 621147, 1325727, 1123492, 800368, 761550, 1359737, 1073726, 36, 53, 141, 41538, 64759, 124160, 69942, 74862, 323543, 247236, 112059, 16595, 37028, 153249, 427642, 1588178, 2738157, 2795672, 2265696, 11951, 33424, 62469, 74720, 166607, 404044, 426967, 38972, 361888, 1143671, 1516716, 160037, 354804, 996944, 1716374, 1982735, 3615225, 4486806, 3037122, 17, 54, 55, 210, 312, 358, 857, 350, 7368, 8443, 6286, 1750, 7367, 14092, 28954, 80779, 176893, 354939, 446792, 33333, 69911, 53144, 29169, 18005, 11704, 13363, 18028, 46547, 14574, 8954, 2483, 14693, 25467, 25215, 41254, 46237, 98263, 185986), .Dim = c(19, 5), .Dimnames = list(c("1820-30", "1831-40", "1841-50", "1851-60", "1861-70", "1871-80", "1881-90", "1891-00", "1901-10", "1911-20", "1921-30", "1931-40", "1941-50", "1951-60", "1961-70", "1971-80", "1981-90", "1991-00", "2001-06"), c("Europe", "Asia", "Americas", "Africa", "Oceania")))
Данные по регионам представлены в столбцах. Мы могли бы использовать их непосредственно в таком виде, добавляя все серии данных по регионам вручную, но после небольшого преобразования мы можем значительно ускорить работу.
> library(reshape2)
> library(plyr)
> df.m = melt(df)
> df.m = rename(df.m, c(Var1 = "Period", Var2 = "Region"))
> library(plyr)
> df.m = melt(df)
> df.m = rename(df.m, c(Var1 = "Period", Var2 = "Region"))
Теперь все готово к построению графика
> a = ggplot(df.m, aes(x = Period, y = value/1e+06, fill = Region)) + labs(x = NULL, y = "Number of People (in millions)n", fill = NULL, title = "Migration to the United States by Source Region (1820-2006)")
> a + geom_bar(stat = "identity", position = "stack")
> a + geom_bar(stat = "identity", position = "stack")
Здесь мы видим некоторые проблемы: название подписи оси x нечитаемы. Позже мы их решим, но сначала давайте изменим палитру цветов.
Цвета по умолчанию вполне ничего себе, но я предпочитаю палитру ColorBrewer.
> b = a + geom_bar(stat = "identity", position = "stack")
> b + scale_fill_brewer(palette = "Set1")
> b + scale_fill_brewer(palette = "Set1")
Далее мы внесем изменения в тему графика по умолчанию, это также поможет нам решить некоторые из упомянутых выше проблем.
> c = b + scale_fill_brewer(palette = "Set1")
> immigration_theme = theme_update(axis.text.x = element_text(angle = 90, hjust = 1), panel.grid.major = element_line(colour = "grey90"), panel.grid.minor = element_blank(), panel.background = element_blank(), axis.ticks = element_blank(), legend.position = "none")
> c + immigration_theme
> immigration_theme = theme_update(axis.text.x = element_text(angle = 90, hjust = 1), panel.grid.major = element_line(colour = "grey90"), panel.grid.minor = element_blank(), panel.background = element_blank(), axis.ticks = element_blank(), legend.position = "none")
> c + immigration_theme
Альтернативные визуализации
Далее я хотел бы показать вам два альтернативных способа визуализации этих данных, используя возможности ggplot2.
> c + facet_grid(Region ~ .) + theme(legend.position = "none")
Кроме того, было бы интересно посмотреть на колебания миграции в целом на том же самом графике. Для этого будет создан новый data frame с годовыми данными по суммарной иммиграции и потом соединен с существующим набором данных (названия переменных в обеих наборах данных должны быть идентичны). Затем мы просто сменим набор данных, на базе которого строится график.
> d = c + facet_grid(Region ~ .) + theme(legend.position = "none")
> total = dcast(df.m, Period ~ ., sum)
> total = rename(total, c(`.` = "value"))
> total$Region = "Total"
> df.m.t = rbind(total, df.m)
> d %+% df.m.t
> total = dcast(df.m, Period ~ ., sum)
> total = rename(total, c(`.` = "value"))
> total$Region = "Total"
> df.m.t = rbind(total, df.m)
> d %+% df.m.t
Комментариев нет:
Отправить комментарий