繁体   English   中英

ggplot geom_line 在 geom_bar 顶部

[英]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:

  1. 要将观察与geom_line()联系起来,您需要添加一个group美学。 因此,如果您只是在geom_line()调用中添加aes(group = 1) ,您将得到一条实际的线。
  2. 我强烈建议您将日期视为numeric而不是character 时间通常是连续的,因此最好以这种方式对待它,除非您有充分的理由将其用作离散变量。
  3. 可能有多种好方法可以将低value国家归为一类。 我刚刚使用if_else 它在这里不起作用,因为但是如果您还没有看到它在不同的环境中做类似的事情,那么值得了解`forcats::fct_lump_*
  4. 最后,要正确缩放第二个轴,您需要提供一个转换因子,用于将轴比例除以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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM