首页 > 解决方案 > 具有多个值的 df 的两个单独条形的条形图

问题描述

以下问题:我有这个数据集

df
Ch         V1          V2
A          a1          a2
B          b1          b2
C          c1          c2
....

而 V1 和 V2 是数值。我想为每个 V1 和 V2 值创建一个带有条形图的条形图。我试过的代码

ggplot(data = df %>% gather(Variable, No., -Ch), 
       aes(x = reorder(ID,-No.), y = No., fill = Variable)) + 
  geom_bar(stat = 'identity', position= position_dodge())+
  geom_col()+
  xlab("Section of industry")+
  ylab("No. of occurences")+
  theme_classic()+
  theme(axis.text.x = element_text(angle = 45, size=1),
        plot.title = element_text(hjust = 0.5),
        legend.position = "top")+
  ggtitle("XXX")

即使使用 position= position_dodge() 它也只会像这样将两个条合并为一个: 在此处输入图像描述 知道如何将它们分开或为什么 positon_dodge() 不起作用?我想是因为我以前使用过收集功能?

另一个问题是,Ch 的值太大,所以如果我想以可读的方式显示它们,图形就会“消失”。有没有办法显示这些值(可能将值写成两行)以便显示?

非常感谢!

标签: rdataframeggplot2

解决方案


您的问题是您在通话中同时拥有geom_bar和,因此geom_bar 中的参数通过产生堆叠条而被超越。因此,删除应该有效。或者,您可以删除并传递给.geom_colggplotposition_dodge()geom_colgeom_colgeom_barposition = position_dodge()geom_col

要缩写您的 x 标签,您可以使用scale_x_discrete(abbreviate)本文中提到的方法:如何在 ggplot 中缩短 x 轴标签文本?

library(dplyr)
library(ggplot2)
library(tidyr)
df %>% pivot_longer(.,-Ch, names_to = "Var", values_to = "Val") %>%
  ggplot(aes(x = Ch, y = Val, fill = Var))+
  geom_col(position = position_dodge())+
  xlab("Section of industry")+
  ylab("No. of occurences")+
  theme_classic()+
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        plot.title = element_text(hjust = 0.5),
        legend.position = "top")+
  ggtitle("XXX")+
  scale_x_discrete(label = abbreviate)

在此处输入图像描述

示例数据

structure(list(Ch = structure(1:5, .Label = c("AAAAAAAAAAAAAA", 
"BBBBBBBBBBBB", "CCCCCCCCCCCCCCCC", "DDDDDDDDDDDDDD", "EEEEEEEEEEEEE"
), class = "factor"), V1 = 1:5, V2 = 5:9), class = "data.frame", row.names = c(NA, 
-5L))

推荐阅读