Метки многострочных осей с вложенными переменными группировки для гистограммы с накоплением в - R

Я хотел бы сделать гистограмму с накоплением с несколькими категориями с вложенной помеченной осью X, используя ggplot, аналогичную той, которую я сделал с помощью Excel, как показано здесь.

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

Я попытался использовать пример, приведенный здесь для несложенной гистограммы с использованием facet_wrap() в результате этого

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

но, как вы видите, этот код распределяет столбцы очень далеко друг от друга и не группирует сложенные столбцы с уровнями категорий (например, 2017, 2030, 2040) рядом друг с другом.

Я также пытался использовать пример здесь, но это позволяет использовать только один уровень категории X, а не два.

Я добавил пример кода ниже (уменьшенный по сравнению с оригиналом, но с тем же намерением).

Некоторая помощь была бы здорово!

data1 <- read.table(text = "Property Category Datetime Value
               PoolRevenue Nuclear 2017 73
               PoolRevenue Nuclear 2030 75
               PoolRevenue CCGT 2017 57
               PoolRevenue CCGT 2030 45
               PoolRevenue Hydro 2017 23
               PoolRevenue Hydro 2030 28
               ReservesRevenue Nuclear 2017 34
               ReservesRevenue Nuclear 2030 37
               ReservesRevenue CCGT 2017 34
               ReservesRevenue CCGT 2030 9
               ReservesRevenue Hydro 2017 23
               ReservesRevenue Hydro 2030 36
               OtherRevenue Nuclear 2017 96
               OtherRevenue Nuclear 2030 98
               OtherRevenue CCGT 2017 55
               OtherRevenue CCGT 2030 53
               OtherRevenue Hydro 2017 60
               OtherRevenue Hydro 2030 65", header=TRUE)
data2 <- read.table(text = "Property Category Datetime Value
                GenCost Nuclear 2017 -10
                GenCost Nuclear 2030 -20
                GenCost CCGT 2017 -15
                GenCost CCGT 2030 -20
                GenCost Hydro 2017 -10
                GenCost Hydro 2030 -15
                FixedCosts Nuclear 2017 -13
                FixedCosts Nuclear 2030 -11
                FixedCosts CCGT 2017 -30
                FixedCosts CCGT 2030 -12
                FixedCosts Hydro 2017 -15
                FixedCosts Hydro 2030 -12", header=TRUE)
data1$Datetime <- as.factor(data1$Datetime)
data2$Datetime <- as.factor(data2$Datetime)
p1 <-ggplot()
p2 <-  p1+ geom_bar(data=data1,aes_string(x="Datetime",y="Value",fill="Property"),stat="identity", position = position_stack(reverse = TRUE))+guides(fill = guide_legend(reverse=TRUE))
p3 <-  p2+ geom_bar(data=data2,aes_string(x="Datetime",y="Value",fill="Property"),stat="identity", position = position_stack(reverse = TRUE))+guides(fill = guide_legend(reverse=TRUE))
p4 <- p3 +facet_wrap(c("Category","Datetime"), strip.position = "bottom", scales = "free_x") + theme(panel.spacing = unit(0, "lines"), strip.background = element_blank(), strip.placement = "outside")

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


person William Zappa    schedule 20.09.2018    source источник


Ответы (1)


Вы имеете в виду что-то вроде этого?

# merge your data   
data_x <- rbind(data1,data2)

    p1 <-ggplot()
 p1+ geom_bar(data=data_x,aes_string(x="Datetime",y="Value", fill ="Property"),stat="identity")+
   facet_wrap(vars(Category), strip.position = "bottom", scales = "free_x")+ 
   theme(panel.spacing = unit(0, "lines"),
         strip.background = element_blank(),
         axis.line = element_line(colour = "grey"),
         panel.grid.major.y =element_line(colour = "grey"),
         strip.placement = "outside",
         axis.text.x = element_text(angle = 90, hjust = 1),
         panel.background = element_rect(fill = 'white', colour = 'white')
         )

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

ИЗМЕНИТЬ

Если вы хотите установить переменные, вы можете попробовать это:

x <-"Datetime"
y <- "Value"
filler <- "Property"
    p1 <-ggplot()
 p1+ geom_bar(data=data_x,aes_string(x=x,y=y, fill =filler),stat="identity")+
   facet_wrap(vars(Category), strip.position = "bottom", scales = "free_x",  nrow=1)+ 
   theme(panel.spacing = unit(0, "lines"),
         strip.background = element_blank(),
         axis.line = element_line(colour = "grey"),
         panel.grid.major.y =element_line(colour = "grey"),
         strip.placement = "outside",
         axis.text.x = element_text(angle = 90, hjust = 1),
         panel.background = element_rect(fill = 'white', colour = 'white')
         )
person s__    schedule 20.09.2018
comment
Спасибо @s_t, да это я хотел! Я также указал 'nrow=1' для facet_wrap(), чтобы поместить все в одну строку, так как на самом деле у меня больше категорий, чем в примере. И последнее, это часть некоторого зацикленного кода, в котором имена заголовков столбцов категорий (например, Datetime, Category, Value, Property) могут меняться. Как изменить код, чтобы разрешить это? Когда я пытаюсь использовать имена переменных, кажется, что сюжет снова забивается... - person William Zappa; 20.09.2018