[英]Flip X & Y coordinates for geom_bar
試圖翻轉 X 和 Y 軸,使其在遠離 (0,0) 時下降。 似乎 coord_flip() & scale_reverse 應該可以解決問題,但它似乎只翻轉一個組變量而不是另一個? 它似乎也忽略了“breaks”語句,因為我希望底部軸的范圍從 0 到 3%。
編輯:這是我運行代碼時圖表的樣子:
這是我試圖復制的外觀:
library(data.table)
library(ggplot2)
library(dplyr)
g0 <- data.table(year = rep(c(1790,1800,1810,1820,1830,1840,1850,1860,1870),2),
group = c(rep("A",9),rep("B",9)),
per = c(0.987,0.983,0.983,0.988,0.992,0.991,0.993,0.992,0,
0.013,0.017,0.017,0.012,0.008,0.009,0.007,0.008,1))
ggplot(g0, aes(x=year, y=per, fill=group)) +
geom_area(alpha = 0.8, size=1) +
coord_flip() +
scale_x_reverse(breaks = as.numeric(seq(1790, 1870, by=10))) +
scale_y_reverse(position = "top", breaks = as.numeric(seq(0, 0.03, by=0.01))) +
theme_minimal() +
scale_fill_manual(values=c('#101010', '#CB0432')) +
theme(plot.title = element_text(hjust = 0.5),
legend.position = "none",
panel.grid.major = element_blank(),
panel.grid.minor = element_blank())
您的問題的解決方案有點棘手,因為您希望放大前 3%。 如果您只是為 y 軸添加限制,則會得到一個空圖,因為ggplot2
將刪除所有大於 0.03 的值,並且所有繪圖區域都鏈接在一起,因此,如果您刪除一個值,則會刪除所有區域.
因此,我將逐步展示如何使用主要dplyr
和tidyr
包進行數據操作(也許有更簡單的解決方案)獲得正確的繪圖,但如果您想要最終的繪圖,則可以跳到最后。
首先,您需要重新調整數據以將 0.03 作為新的最大值(而不是 1),這樣繪圖區域將介於 0 和 3% 之間。 這很容易,因為您只需將 1 替換為 0.03 並根據這個新的最大值和 B 的值計算 A 值:
library(tidyr)
library(dplyr)
g0 %>% pivot_wider(names_from = group, values_from = per) %>%
mutate(B = ifelse(B == 1,0.03,B)) %>%
mutate(A = 0.03-B)
year A B
1 1790 0.017 0.013
2 1800 0.013 0.017
3 1810 0.013 0.017
4 1820 0.018 0.012
5 1830 0.022 0.008
6 1840 0.021 0.009
7 1850 0.023 0.007
8 1860 0.022 0.008
9 1870 0.000 0.030
但是,這是不正確的,因為最后,在您的原始圖中,您在 1860 和 1870 之間有一個從 0.008 到 1 的漸進斜率。我們需要重新創建這個斜率,以便在 y = 0.03 時獲得 x 的值:
lm(per~year, data = df)
Call:
lm(formula = per ~ year, data = df)
Coefficients:
(Intercept) year
-184.5040 0.0992
(0.03 +184.504) /0.0992
[1] 1860.222
所以,現在對於 y = 0.03,x = 1860.222。 我們將這個新行添加到數據框中:
g0 %>% pivot_wider(names_from = group, values_from = per) %>%
mutate(B = ifelse(B == 1,0.03,B)) %>%
mutate(A = 0.03-B) %>%
add_row(year = 1860.222, A = 0, B = 0.03) %>% arrange(year)
year A B
1 1790.000 0.017 0.013
2 1800.000 0.013 0.017
3 1810.000 0.013 0.017
4 1820.000 0.018 0.012
5 1830.000 0.022 0.008
6 1840.000 0.021 0.009
7 1850.000 0.023 0.007
8 1860.000 0.022 0.008
9 1860.222 0.000 0.030
10 1870.000 0.000 0.030
我們還需要從geom_area
切換到geom_ribbon
因為我們的繪圖區域不會回到 0 結束(對於 B 值)。 但為此,我們需要計算ymin
和ymax
參數:
g0 %>% pivot_wider(names_from = group, values_from = per) %>%
mutate(B = ifelse(B == 1,0.03,B)) %>%
mutate(A = 0.03-B) %>%
add_row(year = 1860.222, A = 0, B = 0.03) %>% arrange(year) %>%
mutate(ymin_B = 0, ymax_B = B, ymin_A = B, ymax_A = 0.03)
year A B ymin_B ymax_B ymin_A ymax_A
1 1790.000 0.017 0.013 0 0.013 0.013 0.03
2 1800.000 0.013 0.017 0 0.017 0.017 0.03
3 1810.000 0.013 0.017 0 0.017 0.017 0.03
4 1820.000 0.018 0.012 0 0.012 0.012 0.03
5 1830.000 0.022 0.008 0 0.008 0.008 0.03
6 1840.000 0.021 0.009 0 0.009 0.009 0.03
7 1850.000 0.023 0.007 0 0.007 0.007 0.03
8 1860.000 0.022 0.008 0 0.008 0.008 0.03
9 1860.222 0.000 0.030 0 0.030 0.030 0.03
10 1870.000 0.000 0.030 0 0.030 0.030 0.03
現在,我們幾乎准備好了,只需要一點點清潔就可以讓所有東西都處於正確的形狀:
g0 %>% pivot_wider(names_from = group, values_from = per) %>%
mutate(B = ifelse(B == 1,0.03,B)) %>%
mutate(A = 0.03-B) %>%
add_row(year = 1860.222, A = 0, B = 0.03) %>% arrange(year) %>%
mutate(ymin_B = 0, ymax_B = B, ymin_A = B, ymax_A = 0.03) %>%
select(-c(A,B)) %>%
pivot_longer(-year, names_to = "group", values_to = "values") %>%
mutate(group2 = sub("\\_.","",group)) %>%
rowwise() %>%
mutate(group = unlist(strsplit(group,"_"))[2]) %>%
pivot_wider(names_from = group2, values_from = values)
# A tibble: 20 x 4
year group ymin ymax
<dbl> <chr> <dbl> <dbl>
1 1790 B 0 0.013
2 1790 A 0.013 0.03
3 1800 B 0 0.017
4 1800 A 0.017 0.03
5 1810 B 0 0.017
6 1810 A 0.017 0.03
7 1820 B 0 0.012
8 1820 A 0.012 0.03
9 1830 B 0 0.008
10 1830 A 0.008 0.03
11 1840 B 0 0.009
12 1840 A 0.009 0.03
13 1850 B 0 0.007
14 1850 A 0.007 0.03
15 1860 B 0 0.008
16 1860 A 0.008 0.03
17 1860. B 0 0.03
18 1860. A 0.03 0.03
19 1870 B 0 0.03
20 1870 A 0.03 0.03
現在,我們可以添加繪圖部分,我們得到:
g0 %>% pivot_wider(names_from = group, values_from = per) %>%
mutate(B = ifelse(B == 1,0.03,B)) %>%
mutate(A = 0.03-B) %>%
add_row(year = 1860.222, A = 0, B = 0.03) %>% arrange(year) %>%
mutate(ymin_B = 0, ymax_B = B, ymin_A = B, ymax_A = 0.03) %>%
select(-c(A,B)) %>%
pivot_longer(-year, names_to = "group", values_to = "values") %>%
mutate(group2 = sub("\\_.","",group)) %>%
rowwise() %>%
mutate(group = unlist(strsplit(group,"_"))[2]) %>%
pivot_wider(names_from = group2, values_from = values) %>%
ggplot(aes(x = year, fill = group))+
geom_ribbon(aes(ymin = ymin, ymax = ymax), alpha = 0.8, size = 1)+
coord_flip()+
scale_x_reverse(breaks = as.numeric(seq(1790, 1870, by=10))) +
scale_y_reverse(position = "top", breaks = seq(0,0.03, by=0.01))+
theme_minimal() +
scale_fill_manual(values=c('#101010', '#CB0432')) +
theme(plot.title = element_text(hjust = 0.5),
legend.position = "none",
panel.grid.major = element_blank(),
panel.grid.minor = element_blank())
希望它能回答你的問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.