簡體   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