如何制作每个 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 发散条形图

x轴上方和下方计数的堆积条形图?

Matplotlib条形图仅在非零条形图处显示x-ticks

您如何调整条形宽度以匹配辅助 x 轴?

带有 ggplot2 的条形图用于基因表达

powerbi簇状条形图,如何去掉x轴字段