r - ggplot 和 geom_bar 的问题:希望两列堆叠而不加在一起
问题描述
我正在制作一个条形图,显示两次选举中获得了多少票和候选人。我希望将这些值堆叠起来,但是这些值加在一起以使 y 轴大于应有的值。因此,例如,在 x=23 点,2018 年的值应该只有 800 左右。2019 年的值是正确的,但是将两者相加使 2019 年的值大于应有的值。
我不明白如何获得它,以便它向我显示 2018 年的值,其中 2019 年的值堆叠在其中,而不将两者相加。
这是我正在使用的代码:
ggplot(data = OverallMcCreadyVotes, aes(x=precinct_abbrv, y=McCready,fill=year)) +
geom_bar(stat = "identity") +
scale_fill_manual(
breaks = c("2019","2018"),
values = c("dark blue","light blue")
)
解决方案
如果我理解得很好,你想要stacked bar
但不增加 2018 年到 2019 年的值。
一个可能的技巧(也许存在其他技巧,这是我想到的第一个技巧)是从 2019 年开始操纵你的价值观,让它们成为 2019 年和 2018 年之间的差异。就像那样,一旦你的价值观是绘制,因为stack
您将没有值的总和,而是 2019 年的实际值。
让我用这个例子解释一下(它来自mtcars
我稍微扭曲以使其更漂亮的数据集):
library(tidyverse)
d = mtcars[1:20,]
d <- d %>% group_by(cyl, gear) %>% summarize(M = mean(disp))
d[5,] <- c(8,4,150)
d[6,] <- c(4,3,240)
> d
# A tibble: 6 x 3
# Groups: cyl [3]
cyl gear M
* <dbl> <dbl> <dbl>
1 4 4 104.
2 6 3 242.
3 6 4 164.
4 8 3 365.
5 8 4 150
6 4 3 240
如果我们像您对代码所做的那样进行绘图,我们将得到:
library(ggplot2)
ggplot(d, aes(x = cyl, y = M, fill = as.factor(gear)))+
geom_bar(stat = "identity")
我们最终可以使用position_dodge(0)
一些透明度,但颜色不是很好:
ggplot(d, aes(x = cyl, y = M, fill = as.factor(gear)))+
geom_bar(stat = "identity", position = position_dodge(0), alpha = 0.4)
所以,正如我提到的,我们最终可以从 操纵值gear = 3
,使它们成为gear 3 = gear3- gear4
,我们可以使用tidyr
and来做到这一点dplyr
。(很可能有更简单的方法来实现这个结果,但这是我首先想到的,它只是向您展示我们应该获得什么的想法)
library(tidyverse)
d %>% group_by(cyl) %>% pivot_wider(names_from = "gear", values_from = "M") %>%
mutate(Gear4 = `4`, Gear3 = `3`) %>% mutate(Gear3 = Gear3 - Gear4) %>% select(cyl, Gear4, Gear3) %>%
pivot_longer(., -cyl, names_to = 'Gear', values_to = "Mean")
# A tibble: 6 x 3
# Groups: cyl [3]
cyl Gear Mean
<dbl> <chr> <dbl>
1 4 Gear4 104.
2 4 Gear3 136.
3 6 Gear4 164.
4 6 Gear3 77.7
5 8 Gear4 150
6 8 Gear3 215.
现在,如果你正在绘制它们,你会得到:
ggplot(d, aes(x = as.factor(cyl), y = Mean, fill = Gear)) +
geom_bar(stat = "identity")
你会得到一个堆叠的条形图,其中没有 和 的值gear = 3
总和gear = 4
。
但是,只有当您的所有值 fromGear 3
都优于来自的值时,此示例才有效Gear 4
。否则,你会有一些奇怪的条形图。
对于您的示例,我的个人意见是将其表示为geom_line
:
ggplot(d, aes(x = cyl, y = M, color = as.factor(gear))) + geom_line() + geom_point()
它回答了你的问题吗?
推荐阅读
- python - Beautiful Soup,有条件地提取 Href
- snowflake-cloud-data-platform - 是否可以针对 blob 存储表创建外部阶段?
- sql - 为什么我在尝试加入表时收到 Oracle 错误 ORA-01790?
- hangouts-chat - 如何删除 Bot 消息格式的文本省略号(Google Chat API)
- java - 如何在 android 服务中的 onTaskRemoved 中设置 Firebase 侦听器
- java - 什么是 XML 配置继承到基于 Java 的配置的等价物?
- docker - 如何通过 nginx 反向代理将多个 Vue 前端项目捆绑到一个域中?
- html - 为什么我不能通过 Django 上传图片?
- jenkins-pipeline - Jenkins Pipeline 运行 npm install 失败
- c++ - 如何删除write_json在boost C++中添加到字符串中的特殊字符