簡體   English   中英

翻轉 geom_bar 的 X 和 Y 坐標

[英]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 的值,並且所有繪圖區域都鏈接在一起,因此,如果您刪除一個值,則會刪除所有區域.

因此,我將逐步展示如何使用主要dplyrtidyr包進行數據操作(也許有更簡單的解決方案)獲得正確的繪圖,但如果您想要最終的繪圖,則可以跳到最后。

首先,您需要重新調整數據以將 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 值)。 但為此,我們需要計算yminymax參數:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM