You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将温盐图(T-S图)中的点按pCO2变量进行大小缩放?

问题描述

我制作了一幅温盐图(Temperature-Salinity plot,简称T-S图),需要将图中点的大小按另一变量pCO2进行缩放。温盐图利用温度和盐度计算密度,图中曲线代表密度。

数据示例:

TemperatureSalinitypCO2
23.25336.929352.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:30:52