ggplot在geom_bar上方绘制geom_line

3

我希望在一个图表中简单地显示小麦的产量(geom_line)和进口(geom_bar),并使用从faostat获取的数据。因此,在x轴上=年份,在y轴上=产量,在最终轴上=进口。除此之外,我希望将进口根据国家拆分为不同的条形图,因为有些国家的进口更多,但我不想显示所有国家,只显示前三个,其余的应该放在一个新的类别“其他”中。

我对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个回答

1
你很接近了,但还有一些东西可以帮助你得到想要的情节。
  1. 要将观察结果与 geom_line() 相连,您需要添加一个 group 美学。因此,如果您只需在 geom_line() 调用中添加 aes(group = 1),您就会得到一条实际的线。
  2. 我强烈建议您将日期视为数字而不是字符。时间通常是连续的,因此最好这样处理,除非您有使用它作为离散变量的充分理由。
  3. 将低 value 的国家归类在一起可能有多种好的方法。我只是使用了 if_else。虽然在这里不适用,但值得知道 forcats::fct_lump_* 如果您还没有在其他场合下尝试过类似的操作,则可以使用该工具进行操作。
  4. 堆叠图中颜色出现的顺序(默认情况下在图例中)基于提供的因子水平。它将默认按字母顺序排列,但您可以以多种方式手动设置它({forcats} 具有许多出色的工具可用于此目的)。在这种情况下,要将“other”类别放在末尾,您可以使用 forcats::reorder() 并指定 after = Inf,无论您放置了什么其他级别,它都会被推到末尾。
  5. 最后,要正确缩放第二个轴,您需要提供一个转换因子,在 sec_axis() 内使用它将轴刻度除以,并将您想要在该轴上看到的数据系列乘以相同的因子。
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 包 (v2.0.1) 在 2022-01-17 创建


做得非常好,丹。 - Andrew Ingalls
嗨,丹,谢谢,这正是我要找的,我有一个后续问题。对于堆叠条形图,我该如何更改顺序?例如,我希望始终将“其他”放在底部。 - Artūrs Katamadze
它基于因子级别的顺序。默认为按字母顺序,但您可以手动设置它。 - Dan Adams
1
我使用 forcats::fct_relevel() 更新了我的答案以解决这个问题。 - Dan Adams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接