使用 ggplot2 在 R 中的 y 轴上绘制具有深度(或高程)的垂直剖面的问题

Issues plotting vertical profiles with depth (or elevation) on the y axis in R using ggplot2

我在湖泊实地调查期间收集了温度和溶解氧 (DO) 垂直剖面(从水面到底部)。我正在尝试做一些数据 exploration/viz 来弄清楚如何使用我的数据。我正在尝试按日期在同一个图中绘制我的所有站点,每个调查日期一个温度图(Temp_C)和一个溶解氧图(ODO_mgL)。我有两个“丝束”,一个是 S(开始),一个是 E(结束),我现在只想绘制“S”丝束。

我在绘制这些时遇到问题,有时结果很奇怪。我认为这是因为数据是每秒收集的,所以可能点太多了。有没有办法可以更简洁地绘制它?我可以接受每米取平均值,每米而不是每秒读取一个温度和一个溶解氧(即 1 米(平均)、2 米、3 米、4 米、5 米等处的 1 个温度/溶解氧读数。 .).

library(tidyverse)
library(ggplot2) 
    
sonde <- read.csv("SondeRaw/sonde_max_depth_no.up_byTow.csv",header=TRUE)
    
CH_720 <- sonde %>% 
filter(Date == '7/20/2021' & Tow == 'S')

#Temperature plot for all CH sites 07/20/2021
#This one looks good

ggplot(CH_720) + aes(x=Temp_C, y=Depth_m, color = Site) +
  geom_line() + scale_y_reverse() + xlim(0,25) +
  labs(title="Temperature", x="Temperature (C)", 
       y="Depth (m)", 
       caption="JUL 20 CH Sites") + 
  theme(plot.title=element_text(hjust=0.5),
        plot.caption = element_text(face = "italic")) 

#Dissolved oxygen plot for all CH sites 07/20/2021
#This one looks weird, particularly for site CH711 near the surface

ggplot(CH_720) + aes(x=ODO_mgL, y=Depth_m, color = Site) +
  geom_line() + scale_y_reverse() + xlim(0,11) +
  labs(title="Dissolved Oxygen", x="DO (mg/L)", 
       y="Depth (m)", 
       caption="JUL 20 CH Sites") + 
  theme(plot.title=element_text(hjust=0.5),
        plot.caption = element_text(face = "italic")) 

在此处访问数据:https://github.com/cabanelas/sonde_data 如果您在访问我的数据时遇到问题,请告诉我,我仍在学习如何正确使用 GitHub。刚刚上传这个所以你可以访问我正在使用的东西。

感谢任何帮助。我无法在网上找到有关绘制温度和溶解氧曲线的有用资源。

为了探索数据,至少在开始时,我建议使用 geom_point()geom_line()。无论如何,您面临的问题是因为您正在将自变量映射到 y 美学,而 geom_line() 期望自变量映射到 x。在这种情况下,需要将 orientation = "y" 传递给 geom_line()。这是 'ggplot2' 的一项相当新的功能。 (温度读数的噪音较小,因此它们在您的图中看起来并不太糟糕,但无论如何最好也绘制温度,如下所示的 DO,溶解氧。)

ggplot(CH_720) + aes(x=ODO_mgL, y=Depth_m, color = Site) +
  geom_point() + geom_line(orientation = "y") +
  scale_y_reverse() + xlim(0,11) +
  labs(title="Dissolved Oxygen", x="DO (mg/L)",
       y="Depth (m)",
       caption="JUL 20 CH Sites") +
  theme(plot.title=element_text(hjust=0.5),
        plot.caption = element_text(face = "italic"))

给出:

使用样条曲线进行平滑处理可以使趋势更加清晰。我将观察结果的绘图保留为点,但将它们设为半透明 (alpha = 0.33) 以突出趋势但不删除任何信息。我禁用了置信带的绘制;你可能想添加它。在 geom_smooth() 中,当使用 method="loess" 时,您可以使用传递给 span 的值来调整拟合样条曲线的灵活性。我通过反复试验选择了 0.3。您可以自行选择。

ggplot(CH_720) + aes(x=ODO_mgL, y=Depth_m, color = Site) +
  geom_point(alpha = 0.33) +
  geom_smooth(orientation = "y", method = "loess", span = 0.3, se = FALSE) +
  scale_y_reverse() +
  xlim(0,11) +
  labs(title="Dissolved Oxygen", x="DO (mg/L)",
       y="Depth (m)",
       caption="JUL 20 CH Sites") +
  theme(plot.title=element_text(hjust=0.5),
        plot.caption = element_text(face = "italic"))

由于趋势线重叠,我为站点制作了一个带有单独面板的版本。 (样条曲线,当数据中存在间隙时,有时会产生意想不到的弯曲。在某种程度上,这可以通过调整 span 来避免。)

ggplot(CH_720) + aes(x=ODO_mgL, y=Depth_m, color = Site) +
  geom_point(alpha = 0.33) +
  geom_smooth(orientation = "y", method = "loess", span = 0.3, se = FALSE) +
  scale_y_reverse() +
  xlim(0,11) +
  labs(title="Dissolved Oxygen", x="DO (mg/L)",
       y="Depth (m)",
       caption="JUL 20 CH Sites") +
  theme(plot.title=element_text(hjust=0.5),
        plot.caption = element_text(face = "italic")) +
  facet_wrap(~ Site)

最后我对 DO 使用了对数刻度。这使模式更清晰一些,但可能完全不适合您的数据。

ggplot(CH_720) + aes(x=ODO_mgL, y=Depth_m, color = Site) +
  geom_point(alpha = 0.33) +
  geom_smooth(orientation = "y", method = "loess", span = 0.4, se = FALSE) +
  scale_y_reverse() +
  scale_x_log10(limits = c(1, 12)) +
  #  xlim(0,11) +
  labs(title="Dissolved Oxygen", x="DO (mg/L)",
       y="Depth (m)",
       caption="JUL 20 CH Sites") +
  theme(plot.title=element_text(hjust=0.5),
        plot.caption = element_text(face = "italic")) +
  facet_wrap(~ Site)