[英]ggplot geom_line on top of geom_bar
我希望简单地在 plot 中显示多年来小麦的生产(geom_line)和进口(geom_bar),数据来自 faostat。 所以基本上在 x 轴 = 年份,在 y 轴 = 生产,最后一个轴 = 进口。 除此之外,我希望将条形按国家/地区拆分以供进口,因为从某个国家/地区进口更多,但我不希望显示所有条形,只有前 3 个和 rest 应该在一个新的“其他”类别。
我对 R 中的代码非常不满意,但是一旦我有了基础,我就可以弄清楚如何调整它的外观,只需要弄清楚如何开始。
在这里,我在 plot 栏中提供了一个简化的数据集,我只想显示 3 个最高值,并将 rest 组合成一个新的类别“其他”。 并且 geom_line 应该显示在其顶部,右侧有一个单独的轴,由于某种原因 geom_line 不适合我。
import <- data.frame(country = c("USA", "USA", "EU", "NZ", "EU", "Bulgaria", "Romania", "Serbia"),
date = c("1991", "1992", "1994", "1995", "1991", "1991", "1991", "1991"),
value = c(1000, 500, 2000, 1500, 1000, 100, 500, 500))
production <- data.frame(date = c("1991", "1992", "1994", "1995", "1995"),
value = c(50, 45, 40, 39, 38))
ggplot(data = import, mapping = aes(x=date, y=value, fill=country)) +
geom_col()
ggplot(data = production, aes(x=date, y=value)) +
geom_line()
任何正确方向的帮助或指导将不胜感激。 先感谢您! 在帮助下爱这个社区总是很棒<3
您已经很接近了,但有几件事可以让您获得您想要的 plot:
geom_line()
联系起来,您需要添加一个group
美学。 因此,如果您只是在geom_line()
调用中添加aes(group = 1)
,您将得到一条实际的线。numeric
而不是character
。 时间通常是连续的,因此最好以这种方式对待它,除非您有充分的理由将其用作离散变量。value
国家归为一类。 我刚刚使用if_else
。 它在这里不起作用,因为但是如果您还没有看到它在不同的环境中做类似的事情,那么值得了解`forcats::fct_lump_* 。sec_axis()
内部,然后将要在该轴上看到的数据系列乘以相同的 vactor。library(tidyverse)
# create data with date as numeric
import <- data.frame(country = c("USA", "USA", "EU", "NZ", "EU", "Bulgaria", "Romania", "Serbia"),
date = c(1991, 1992, 1994, 1995, 1991, 1991, 1991, 1991),
value = c(1000, 500, 2000, 1500, 1000, 100, 500, 500))
# lump into 'other' if not in top 3
import <- import %>%
mutate(country = if_else(value >= sort(value,decreasing = T)[3],
country,
"other"))
# create data with date as numeric
production <- data.frame(date = c(1991, 1992, 1994, 1995, 1995),
value = c(50, 45, 40, 39, 38))
# calculate scling factor for second axis
trans_fct <- max(import$value)/max(production$value)
# plot with second axis, scaling data series that appears on that axis
ggplot() +
geom_col(data = import,
mapping = aes(x = date, y = value, fill = country)) +
geom_line(data = production, aes(
x = date,
y = value * trans_fct,
group = 1
)) +
scale_y_continuous(name = "Import",
sec.axis = sec_axis( ~ . / trans_fct, name = "Production"))
由代表 package (v2.0.1) 于 2022 年 1 月 13 日创建
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.