具有嵌套分组变量的多行轴标签,用于 - R 中的堆积条形图
Multirow axis labels with nested grouping variables for stacked bar plot in - R
我想使用 ggplot 制作一个包含多个类别的堆叠条形图,并使用嵌套标记的 X 轴,类似于我使用 Excel 制作的条形图,如此处所示。
我尝试使用给定 here 的示例作为非堆叠条形图,使用 facet_wrap()
得到这个
但如您所见,此代码将列分散得很远,并且不会将类别级别(即 2017、2030、2040)的堆叠条聚集在一起。
我也尝试使用示例 here 但这只允许一个 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")
(请注意,由于我的堆叠条形图中既有正值也有负值,因此我将它们应用为单独的层,但我认为这不会影响坐标轴。)
你的意思是这样的吗?
# 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')
)
我想使用 ggplot 制作一个包含多个类别的堆叠条形图,并使用嵌套标记的 X 轴,类似于我使用 Excel 制作的条形图,如此处所示。
我尝试使用给定 here 的示例作为非堆叠条形图,使用 facet_wrap()
得到这个
但如您所见,此代码将列分散得很远,并且不会将类别级别(即 2017、2030、2040)的堆叠条聚集在一起。
我也尝试使用示例 here 但这只允许一个 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")
(请注意,由于我的堆叠条形图中既有正值也有负值,因此我将它们应用为单独的层,但我认为这不会影响坐标轴。)
你的意思是这样的吗?
# 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')
)