[英]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:
geom_line()
聯系起來,您需要添加一個group
美學。 因此,如果您只是在geom_line()
調用中添加aes(group = 1)
,您將得到一條實際的線。numeric
而不是character
。 時間通常是連續的,因此最好以這種方式對待它,除非您有充分的理由將其用作離散變量。value
國家歸為一類。 我剛剛使用if_else
。 它在這里不起作用,因為但是如果您還沒有看到它在不同的環境中做類似的事情,那么值得了解`forcats::fct_lump_* 。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.