我希望在一個圖中簡單地顯示多年來小麥的生產(geom_line)和進口(geom_bar),資料來自faostat。所以基本上在 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
uj5u.com熱心網友回復:
你很接近,但有幾件事可以讓你得到你想要的情節:
- 要將觀察與您聯系起來,
geom_line()您需要添加group美學。因此,如果您只是aes(group = 1)在geom_line()通話中添加,您將得到一條實際的線路。 - 我強烈建議您將日期視為
numeric而不是character. 時間通常是連續的,因此最好以這種方式對待它,除非您有充分的理由將其用作離散變數。 - 可能有多種好方法可以將低
value國家歸為一類。我剛用過if_else。它在這里行不通,因為但是forcats::fct_lump_*如果您還沒有看過它,因為在不同的環境中做類似的事情,這是值得知道的。 - 顏色出現在堆積圖中的順序(并且在圖例中默認出現)基于所提供因子中的級別。它默認為字母順序,但您可以通過多種方式手動設定它(盡管{forcats}有許多用于此目的的好工具。在這種情況下,要將
"other"類別放在最后,您可以使用forcats::reorder()并指定after = Inf推送該類別水平到最后,無論你還有什么。 - 最后,要正確縮放第二個軸,您需要提供一個轉換因子,用于將軸比例除以內部
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 包創建于 2022-01-17 (v2.0.1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/416800.html
標籤:
