ggplot中具有不同y轴的镜像柱图

数据挖掘 r 可视化 ggplot2
2022-03-15 05:43:40

我正在尝试转换此图 在此处输入图像描述

成镜柱图 在此处输入图像描述

我有两个数据集:

  1. school_purchases

  2. 最近的学校射击

我对可视化不是很有经验,但这是我的方法

ggplot(school_purchases_month, aes(x = date, y = total)) +
  geom_col(fill = "black", color = "white") #this plots one column chart of spending

我也想要最近的学校射击$killed在另一边

recent_school_shootings$killed=mutate(recent_school_shootings, killed= -killed)

ggplot(school_purchases_month, aes(x = date, y = total)) +
  geom_col(fill = "black", color = "white") +
  geom_col(data = subset(recent_school_shootings, killed > 0), 
             aes(x = date, y = killed))

但它会引发各种错误。你能指出我正确的方向吗?

1个回答

您可以将数据重新整形为长格式(在加入两个数据集之后)并使用geom_col一次,或者像您的问题一样使用两个几何。但是,后者需要一些变化才能具有aesingeom_col和 not in ggplot

下面,我有一个mpg数据集示例,说明了两个选项(加入除外)。我还在您的数据集中包含了一个示例,但由于您没有可重现的示例,因此我无法确定结果。

library(dplyr)
library(ggplot2)
library(tidyr)
## Calling geom_col twice
mpg %>% 
  group_by(manufacturer) %>% 
  summarise_if(is.numeric, mean) %>% 
  select(manufacturer, cty, hwy) %>% 
 ggplot() +
  geom_col(aes(x=manufacturer, y=hwy, fill="hwy")) +
  geom_col(aes(x=manufacturer, y=-cty, fill="cty")) +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.4))

## Converting data to long format
mpg %>% 
  group_by(manufacturer) %>% 
  summarise_if(is.numeric, mean) %>% 
  mutate(cty = -cty) %>% 
  select(manufacturer, cty, hwy) %>% 
  pivot_longer(., -manufacturer) %>% 
 ggplot() +
  geom_col(aes(x=manufacturer, y=value, fill=name)) +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.4))

对于您的数据集,首先我们将它们加入date列,然后我们可以geom_col在每个所需的列上使用它们。请注意,我有aesingeom_col而不是ggplot. 您需要确保您的date专栏不是类别factor(但加入可能会解决该问题)。如果您共享dput(head(dataset))两个数据集的每一个的输出,我可以进一步调查您的问题。

recent_school_shootings %>% 
  full_join(., school_purchases_month, by = "date", suffix = c("s", "p")) %>%
 ggplot() +
  geom_col(aes(x=date, y=total, fill="Purchase")) +
  geom_col(aes(x=date, y=-killed, fill="Shooting"))

reprex 包于 2020-05-20 创建(v0.3.0)