如何制作每个 X 轴项目有两个值的垂直条形图
Posted
技术标签:
【中文标题】如何制作每个 X 轴项目有两个值的垂直条形图【英文标题】:How to make a vertical bar chart with two values per every X axis item 【发布时间】:2021-11-05 10:20:45 【问题描述】:以下是样本数据和到目前为止所做的操作。为了给出上下文,我有代码和标题显示的某些行业。接下来是三个时间段(第一、第二、第三)。它们分别代表 2020-02-01、2020-04-01 和 2021-07-01,但为了便于处理,我将它们重命名。我们的目标是制作一个垂直条形图,从左到右显示各个行业的下降和恢复值。因此,每个行业 2 个,总共 8 个。因此,对于全部非农而言,将有两个彼此相邻的栏,而不是彼此堆叠。
当我这样做时,我收到一个关于“错误:stat_count() 只能具有 x 或 y 美学”的错误。 下面是我用来创建此图表的代码。有关如何解决此错误的任何想法?
library(dplyr)
library(ggplot2)
seriescode <- c(00,11,22,23)
seriestitle <-c("Total Nonfarm","Mining","Utilities","Construction")
first <- c(100,20,32,44)
second <- c(95,17,25,30)
third <- c(98,18,26,33)
bartest <-data.frame(seriescode,seriestitle,first,second,third)
bartest <- bartest %>% mutate(Decline = first - second)
bartest <- bartest %>% mutate(Recovery = third-second)
bartest <- bartest %>% pivot_longer(cols = Decline:Recovery, names_to = "change_type", values_to = "change")
chart4 <- bartest %>%ggplot(aes(x=seriestitle,y=change, fill = change_type))+geom_bar()+labs(x="Industry",y="Net Change")+scale_y_continuous(labels = comma)+ggtitle("Decline and Recovery by Industry")
【问题讨论】:
【参考方案1】:您需要使用geom_col
或更改geom_bar
中的统计信息,原因如下:
?geom_bar
geom_bar() 使条的高度与数量成正比 每组中的案例(或者如果提供了重量美学,则总和 权重)。如果您希望条形图的高度代表 数据中的值,请改用 geom_col()。 geom_bar() 使用 stat_count() 默认情况下:它计算每个 x 处的案例数 位置。 geom_col() 使用 stat_identity():它保持数据不变。
比你的结果是这样的:
代码
bartest %>%
mutate(
Decline = first - second,
Recovery = third-second
) %>%
pivot_longer(cols = Decline:Recovery, names_to = "change_type", values_to = "change") %>%
ggplot(aes(x=seriestitle,y=change, fill = change_type))+
geom_col(position = "dodge")+
labs(
title = "Decline and Recovery by Industry",
x = "Industry",
y = "Net Change")
输出
【讨论】:
菲利克斯,我怎样才能让酒吧彼此相邻而不是彼此堆叠。我需要从左到右总共八个...每个系列代码/系列标题两个。 对于@TimWilcox,您需要更改几何内部的参数position
,在本例中为position = "dodge"
。我更新了我的答案【参考方案2】:
library(tidyverse)
seriescode <- c(00,11,22,23)
seriestitle <-c("Total Nonfarm","Mining","Utilities","Construction")
first <- c(100,20,32,44)
second <- c(95,17,25,30)
third <- c(98,18,26,33)
bartest <-data.frame(seriescode,seriestitle,first,second,third)
bartest <- bartest %>% mutate(Decline = first - second)
bartest <- bartest %>% mutate(Recovery = third-second)
bartest <- bartest %>% pivot_longer(cols = Decline:Recovery, names_to = "change_type", values_to = "change")
bartest %>%
ggplot(aes(seriestitle, change, fill = change_type)) +
geom_bar(stat = "identity", position = "dodge")
由reprex package (v2.0.1) 于 2021-09-08 创建
【讨论】:
以上是关于如何制作每个 X 轴项目有两个值的垂直条形图的主要内容,如果未能解决你的问题,请参考以下文章
将 y 轴移动到中间并在每侧制作两个图例以用于 Plotly 发散条形图