使用 ggplot 调整辅助 y 轴

时间:2021-02-07 00:59:43

标签: r ggplot2

我正在尝试使用 ggplot 绘制两个不同的数据集,重建温度 (10-16) 和木炭数据 (0-140),具有两个不同的时间序列值。这可能吗?

我使用了这段代码(见下文),但不幸的是它产生了一个图(见下文),限制了温度重建的可变性。有没有办法调整 y 轴,以便我们可以看到温度记录的更多变化?

非常感谢您的支持。

R 代码

df <- data.frame(Charfiretempdata$AGETEMPS, Charfiretempdata$FIREAGE, Charfiretempdata$Comp2TEMPS,Charfiretempdata$Char.Acc.Rate..Char...cm.2.yr.1.)

ggplot(df)  + 
  
geom_col(mapping = aes(x = Charfiretempdata$FIREAGE, 
y = Charfiretempdata$Char.Acc.Rate..Char...cm.2.yr.1. * 16/150), size = 2, color = "darkblue", 
fill = "white") +
  
geom_line(mapping = aes(x = Charfiretempdata$AGETEMPS, y = Charfiretempdata$Comp2TEMPS)) + 
  
geom_point(mapping = aes(x = Charfiretempdata$AGETEMPS, y = Charfiretempdata$Comp2TEMPS), size 
= 3, shape = 21, fill = "white")+
  scale_y_continuous(
    name = expression("Temperature ("~degree~"C)"),
    sec.axis = sec_axis(~ . * 150/16 , name = "Charcoal (mm)"))

R 图

enter image description here

1 个答案:

答案 0 :(得分:1)

我创建了一个与您的数据具有相似特征的随机样本数据。

library(dplyr)
library(ggplot2)

set.seed(282930)
df <- tibble(x_axis = c(1400, 1500, 1600, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
                   2007, 2008, 2009, 2010, 2011, 2012, 2013, 2015, 2016, 2017),
             y_axis_1 = runif(20, min = 10, max = 16),
             y_axis_2 = runif(20, min = 0, max = 150))

这里是df

> df
# A tibble: 20 x 3
   x_axis y_axis_1 y_axis_2
    <dbl>    <dbl>    <dbl>
 1   1400     15.7     5.28
 2   1500     11.8   141.  
 3   1600     14.5   149.  
 4   2000     11.6   121.  
 5   2001     15.6    37.3 
 6   2002     15.0    72.5 
 7   2003     10.7   130.  
 8   2004     15.4    84.7 
 9   2005     11.5   118.  
10   2006     10.4    17.4 
11   2007     11.3   124.  
12   2008     13.6    22.6 
13   2009     13.0    14.5 
14   2010     15.9   142.  
15   2011     12.3   103.  
16   2012     10.3   131.  
17   2013     12.6    93.6 
18   2015     14.6    12.4 
19   2016     11.4    27.9 
20   2017     15.3   116. 

这是与您相似但轴调整不同的 ggplot

ggplot(df, 
       # as they sharing same X-axis you can define share variable aes in the 
       # main call of ggplot
       aes(x = x_axis))  + 
  geom_col(mapping = 
             # added 10 to 2nd axis value as will scale from 10 instead of 0
             aes(y = (y_axis_2 * 10 / 150) + 10), 
           # the size here is size of the border - and due to the nature of
           # your data, the col suppose to be very thin to match with that one
           # tick on x-axis - so the inner fill is covered by dark blue border
           size = 2, color = "darkblue", 
           # The fill is not really useful as you cannot see it.
           fill = "white") +
  geom_line(mapping = aes(y = y_axis_1)) + 
  geom_point(mapping = aes(y = y_axis_1), size 
             = 3, shape = 21, fill = "white") +
  # Set the main Axis start at 10 instead of 0 so it would allow more zoom into it
  coord_cartesian(ylim = c(10, 20), expand = c(0, 0)) +
  scale_y_continuous(
    name = expression("Temperature ("~degree~"C)"),
    # The calculation of second axis lable is calculate base on 1st axis.
    # and as the 1st axis start at 10, there fore the fomular need to minus 10
    # before multiply back 15 - I keep 150 / 10 so it clear reverse of original 
    # transform of the 2nd axis value above.
    sec.axis = sec_axis(~ (. - 10) * 150 / 10 , name = "Charcoal (mm)"))

这是示例输出图 First plot

即使调整了 y 轴,我们也几乎看不到数据末尾的温度,因为末尾有更多的数据点。我认为如果你最后不需要所有的数据点,你可以每 10 倍取一次,因为数据在 600 年的范围内,所以你不需要在最后绘制这么多细节。如果您需要详细信息,只需分别绘制该时间范围

最后过滤数据,改为每 10 年一次

ggplot(df %>% filter(x_axis <= 2000 | x_axis %% 10 == 0),
       aes(x = x_axis)) + 
  # similar code to above but I use geom_bar instead
  geom_bar(mapping = 
             aes(y = (y_axis_2 * 10 / 150) + 10),
           stat = "identity", size = 2, color = "darkblue",
           fill = "white") +
  geom_line(mapping = aes(y = y_axis_1)) + 
  geom_point(mapping = aes(y = y_axis_1), size 
             = 3, shape = 21, fill = "white")+
  scale_y_continuous(
    name = expression("Temperature ("~degree~"C)"),
    sec.axis = sec_axis(~ (. - 10) * 150/10 , name = "Charcoal (mm)")) +
  coord_cartesian(ylim = c(10, 20), expand = c(0, 0))

filter every 10 year

(如您所见,数据点较少,我们开始看到填充,因为绘图有更多空间)

在数据末尾放大

ggplot(df %>% filter(x_axis >= 2000),
       aes(x = x_axis)) + 
  # similar code to above but I use geom_bar instead
  geom_bar(mapping = 
             aes(y = (y_axis_2 * 10 / 150) + 10),
           stat = "identity", size = 2, color = "darkblue",
           fill = "white") +
  geom_line(mapping = aes(y = y_axis_1)) + 
  geom_point(mapping = aes(y = y_axis_1), size 
             = 3, shape = 21, fill = "white")+
  scale_y_continuous(
    name = expression("Temperature ("~degree~"C)"),
    sec.axis = sec_axis(~ (. - 10) * 150/10 , name = "Charcoal (mm)")) +
  coord_cartesian(ylim = c(10, 20), expand = c(0, 0))

Graph zoom in at the end

(现在我们可以看到深蓝色边框和里面的白色填充)

相关问题