R: несколько столбцов для каждого элемента оси X в стеке geom_bar (ggplot) - PullRequest
1 голос
/ 07 февраля 2020

У меня есть данные о занятости в разных классах навыков для разных провинций с течением времени. Я хотел бы показать занятость с течением времени в разных провинциях и классах на одном графике. На следующем рисунке показано, что я хочу, но только на один год (2000)

ggplot(df, aes(fill=classes, y=total/10^6, x=province)) + 
  geom_bar(position="stack", stat="identity") 

enter image description here

Но я бы хотел иметь каждый бар каждый год) повторяется два раза (в примере у меня есть 2 года) для каждой провинции на одном графике. Другими словами, я хотел бы показать данные 2001 года на том же графике, как показано выше, рядом со столбиками за 2000 год.

Вот часть данных:

df <- structure(list(year = c(2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 
2000L, 2000L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 
2001L), province = c("Alberta", "Alberta", "Alberta", "Alberta", 
"Manitoba", "Manitoba", "Manitoba", "Manitoba", "Alberta", "Alberta", 
"Alberta", "Alberta", "Manitoba", "Manitoba", "Manitoba", "Manitoba"
), classes = structure(c(2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 
3L, 4L, 1L, 2L, 3L, 4L, 1L), .Label = c("[0,0.2]", "(0.2,0.4]", 
"(0.4,0.6]", "(0.6,0.8]", "(0.8,1)", "1"), class = "factor"), 
    total = c(11387250L, 4373500L, 18250L, 3215500L, 3984750L, 
    1414750L, 2000L, 1222750L, 11838250L, 4390000L, 21250L, 3272750L, 
    4019750L, 1331750L, 7750L, 1237000L)), row.names = c(NA, 
-16L), vars = c("year", "province", "classes"), drop = TRUE, class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"), indices = list(3L, 0L, 1L, 2L, 
    7L, 4L, 5L, 6L, 11L, 8L, 9L, 10L, 15L, 12L, 13L, 14L), group_sizes = c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), biggest_group_size = 1L, labels = structure(list(
    year = c(2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 
    2000L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L
    ), province = c("Alberta", "Alberta", "Alberta", "Alberta", 
    "Manitoba", "Manitoba", "Manitoba", "Manitoba", "Alberta", 
    "Alberta", "Alberta", "Alberta", "Manitoba", "Manitoba", 
    "Manitoba", "Manitoba"), classes = structure(c(1L, 2L, 3L, 
    4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), .Label = c("[0,0.2]", 
    "(0.2,0.4]", "(0.4,0.6]", "(0.6,0.8]", "(0.8,1)", "1"), class = "factor")), row.names = c(NA, 
-16L), vars = c("year", "province", "classes"), drop = TRUE, class = "data.frame"))

1 Ответ

1 голос
/ 07 февраля 2020

Это то, что вы ищете?

ggplot(df, aes(fill=classes, y=total/10^6, x=as.factor(year))) + 
  geom_bar(position="stack", stat="identity") +
  facet_wrap(.~province)

enter image description here

В соответствии с предложением @ user12728748, вы можете изменить поле панели, чтобы сделать это больше похоже на один сюжет:

ggplot(df, aes(fill=classes, y=total/10^6, x=as.factor(year))) + 
  geom_bar(position="stack", stat="identity") +
  facet_wrap(.~province)+
  theme(panel.margin = grid::unit(-1.25, "lines"))

enter image description here

Примечание: будьте осторожны, потому что этот трюк нельзя использовать, если вы установили scales = free в вашем facet_wrap.

...