gpt4 book ai didi

r - ggplot geom_line 在 geom_bar 之上

转载 作者:行者123 更新时间:2023-12-05 05:49:06 25 4
gpt4 key购买 nike

我希望使用从 faostat 中提取的数据简单地在一个图中显示多年来小麦的产量 (geom_line) 和进口量 (geom_bar)。所以基本上在 x 轴上 = 年,在 y 轴上 = 生产,在最后一个轴上 = 进口。除此之外,我希望将条形图按国家/地区分开以便进口,因为从某个国家/地区进口的更多,但我不希望显示所有条形图,只有前 3 个,其余的应该在一个新的类别“其他”。

我不太熟悉 R 中的代码,但一旦有了基础,我就能弄清楚如何调整它的外观,只需要弄清楚如何开始。

我在这里提供了一个简化的数据集,如前所述,在条形图中我只想显示 3 个最高值,并将其余值合并到一个新类别“其他”中。并且 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

最佳答案

你很接近,但有一些事情可以让你得到你想要的情节:

  1. 要将观察结果与 geom_line() 联系起来,您需要添加一个 group 美学。因此,如果您只是在 geom_line() 调用中添加 aes(group = 1),您将获得一条实际线路。
  2. 我强烈建议您将日期视为数字 而不是字符。时间通常是连续的,因此最好以这种方式对待它,除非您有充分的理由将它用作离散变量。
  3. 可能有多种方法可以将低值(value) 国家归为一类。我刚刚使用了 if_else。它在这里不起作用,因为但值得了解 forcats::fct_lump_*如果您因为在不同的环境中做类似的事情而还没有看过它。
  4. 颜色在堆积图中的显示顺序(以及图例中的默认顺序)基于所提供的因子中的水平。它将默认按字母顺序排列,但您可以通过多种方式手动设置它(虽然 {forcats} 有许多用于此目的的好工具。在这种情况下,将 “other” 类别放在end 你可以使用 forcats::reorder() 并指定 after = Inf 将那个级别推到最后,无论你还有什么。
  5. 最后,要正确缩放第二个轴,您需要提供一个转换因子,用于在 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 and move to end
import <- import %>%
mutate(country = if_else(value >= sort(value,decreasing = T)[3],
country,
"other")) %>%
mutate(country = fct_relevel(country, "other", after = Inf))

# 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"))

reprex package 创建于 2022-01-17 (v2.0.1)

关于r - ggplot geom_line 在 geom_bar 之上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70704887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com