如何将温盐图(T-S图)中的点按pCO2变量进行大小缩放?
问题描述
我制作了一幅温盐图(Temperature-Salinity plot,简称T-S图),需要将图中点的大小按另一变量pCO2进行缩放。温盐图利用温度和盐度计算密度,图中曲线代表密度。
数据示例:
| Temperature | Salinity | pCO2 |
|---|---|---|
| 23.253 | 36.929 | 352.7 |
当前绘图代码(先绘制框架,再手动添加点):
# 绘制图框架 library(shape) library(marelac) library(plot3D) S.seq <- seq(from = 20, to = 40, length.out = 100) t.seq <- seq(from = 20, to = 40, length.out = 100) sig.mat <- outer(S.seq, t.seq, FUN = function(S, t) sw_dens(S = S, t = t) - 1000) # 绘制密度等值线框架 contour2D(x = S.seq, y = t.seq, z = sig.mat, lwd = 3, xlab = 'Salinity', ylab = 'Temperature (°C)',main = 'Surface T-S')
手动创建点并添加的示例:
t2s = 23.253 S2s = 36.929 scatter2D(S2s, t2s, pch=20, col ='darkgreen', cex= 1, add= TRUE, clim = range(sig.mat), colkey = FALSE)
现在需要让点的大小随pCO2值缩放,同时希望得到更简便的绘图方法建议。
解决方案
1. 修改现有plot3D代码实现点大小随pCO2缩放
不要手动逐个创建点,先把数据整理成数据框,再通过scatter2D一次性绘制所有点,用cex参数绑定pCO2值实现大小缩放:
# 假设你的数据存储在dataframe中 df <- data.frame( Temperature = c(23.253, 24.12, 22.89), Salinity = c(36.929, 37.1, 36.7), pCO2 = c(352.7, 380.5, 340.2) ) # 绘制密度等值线框架(与原代码一致) library(shape) library(marelac) library(plot3D) S.seq <- seq(from = 20, to = 40, length.out = 100) t.seq <- seq(from = 20, to = 40, length.out = 100) sig.mat <- outer(S.seq, t.seq, FUN = function(S, t) sw_dens(S = S, t = t) - 1000) contour2D(x = S.seq, y = t.seq, z = sig.mat, lwd = 3, xlab = 'Salinity', ylab = 'Temperature (°C)',main = 'Surface T-S') # 用pCO2控制点大小,通过缩放系数调整显示效果 scatter2D(df$Salinity, df$Temperature, pch=20, col='darkgreen', cex = df$pCO2 / max(df$pCO2) * 3, # 归一化后放大3倍,可按需调整系数 add=TRUE, clim = range(sig.mat), colkey = FALSE)
2. 更简便的ggplot2绘图方法
用ggplot2绘制T-S图更灵活高效,无需手动处理图层叠加,代码逻辑更清晰:
library(ggplot2) library(marelac) # 生成密度等值线数据 S.seq <- seq(from = 20, to = 40, length.out = 100) t.seq <- seq(from = 20, to = 40, length.out = 100) sig.mat <- outer(S.seq, t.seq, FUN = function(S, t) sw_dens(S = S, t = t) - 1000) contour_df <- as.data.frame(expand.grid(Salinity = S.seq, Temperature = t.seq)) contour_df$Density <- as.vector(sig.mat) # 绘制T-S图 ggplot() + # 添加密度等值线 geom_contour(data = contour_df, aes(x = Salinity, y = Temperature, z = Density), lwd = 1.2) + # 添加散点,点大小由pCO2控制 geom_point(data = df, aes(x = Salinity, y = Temperature, size = pCO2), color = 'darkgreen', alpha = 0.7) + # 设置坐标轴、标题和图例 labs(x = 'Salinity', y = 'Temperature (°C)', title = 'Surface T-S', size = 'pCO2') + theme_bw() + # 调整点大小的显示范围 scale_size_continuous(range = c(1, 5)) # 最小点大小1,最大5,可按需修改
内容的提问来源于stack exchange,提问作者garfunkl_30
相关产品推荐
相关产品推荐

