物理海洋学论文图的「可复用绘图规范 + 代码工具箱」。既是 DeepSeek Harness / Agent…
31.5/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/28 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Char0nChengg/oceanography-plotting-style该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
dsh 原生插件 · vision
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 5 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(unknown · 2026/10/23) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0⚪ 扫描:无法判定尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0已尝试扫描但取不到可分析的源码:仓库或包不存在、已删除,或为非 JS/TS 实现、未随包发布源码。无法判定,不代表安全。
- · 包内无可扫 JS
- · TS 源码(可能为非 JS 实现或未发布源码),无法判定
扫描于 2026/10/31(1 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
用 Matplotlib、Cartopy 和 cmocean 绘制出版级物理海洋学图表的可复用 DSH/智能体技能。
README
由 DeepSeek 最新模型翻译生成海洋学绘图风格
物理海洋学论文图的「可复用绘图规范 + 代码工具箱」。既是 DeepSeek Harness / Agent Skill,也是可单独安装的 Python 小包。
这是什么?
做海洋学论文图时,真正花时间的通常不是 pcolormesh,而是这些反复出现的问题:
- 经纬度顺序反了、1D/2D 坐标广播错了;
- 0–360° 和 −180–180° 混用,跨日界线图断裂;
- 色标 extend 和实际数据范围不一致;
- 多面板字号在最终印刷宽度下小得看不清;
- 地图被 set_aspect("auto") 拉扁;
- 10m 海岸线让 PDF 变成几十 MB;
- 时间轴跨年却还在用 %m-%d;
- 图能跑,但标签被裁、刻度重叠、色标没有单位。
这个项目把上述经验固化成一套 可被 Agent 加载的 Skill,同时提供可导入的 Python 工具、可运行的模板、测试和 CI。目标不是「画出来」,而是能直接放进论文。
展开完整文档(README 剩余 1 节)
海洋学绘图风格
物理海洋学论文图的「可复用绘图规范 + 代码工具箱」。既是 DeepSeek Harness / Agent Skill,也是可单独安装的 Python 小包。
这是什么?
做海洋学论文图时,真正花时间的通常不是 pcolormesh,而是这些反复出现的问题:
- 经纬度顺序反了、1D/2D 坐标广播错了;
- 0–360° 和 −180–180° 混用,跨日界线图断裂;
- 色标 extend 和实际数据范围不一致;
- 多面板字号在最终印刷宽度下小得看不清;
- 地图被 set_aspect("auto") 拉扁;
- 10m 海岸线让 PDF 变成几十 MB;
- 时间轴跨年却还在用 %m-%d;
- 图能跑,但标签被裁、刻度重叠、色标没有单位。
这个项目把上述经验固化成一套 可被 Agent 加载的 Skill,同时提供可导入的 Python 工具、可运行的模板、测试和 CI。目标不是「画出来」,而是能直接放进论文。
English introduction: README.en.md — a reusable Agent Skill and Python toolkit for publication-quality physical-oceanography figures with Matplotlib, Cartopy and cmocean.
设计立场
本项目的所有绘图风格都按作者的个人偏好设计,不是期刊官方模板。不同作者、期刊和审稿人有各自的视觉传统;有些常见的投稿图把较多注意力放在装饰、饱和度或层层堆叠的文字上,反而削弱了数据本身的可读性。本项目选择更克制、信息密度更高的表达,但不评判其他作者,投稿时仍以目标期刊最新指南为准。
- 只用 cmocean 色标:不用 jet/rainbow;根据变量属性选择顺序、发散或循环色标。
- 图优先、文字克制:没有整张图的主标题,只有子图副标题和 (a)/(b) 面板字母;能共享的横纵坐标就共享。
- Colorbar 清晰但不占主图:优先外置列、图下横条或 inset,必要时使用分段/拼接色标;刻度 4–7 个,extend 必须诚实。
- 分析图同源:CCA、小波、谱分析、EMD 等也采用同一套作者风格;这些做法已在作者本人的投稿与返修中使用,并接受过期刊编辑与审稿流程的检验。后续计划整理由问题驱动的海洋/大气统计分析教程。
完整说明见 设计立场。这是一套可重复、可检查的个人工作流,不是唯一的正确审美。
示例
3×2 区域地图(合成数据,仅演示版式与色标):
3x2 map demo
地图 + 时间序列 + 垂向剖面(合成数据):
mixed panel demo
模板默认使用 50m 海岸线以控制 PDF 体积;单张大图可切到 10m。所有模板都要求显式 --demo 才会运行,避免把合成图误当结果图。
主要能力
| 能力 | 说明 |
| 区域地图 | PlateCarree、经纬度 formatter、自适应刻度、陆地/海岸线、比例保护 |
| 多面板版式 | 共用色标、内侧标签隐藏、面板字母、GridSpec / 显式 colorbar 列 |
| 垂向剖面 / Hovmöller | 深度方向、时间轴、对称/非对称色标、转置校验 |
| 时间序列 | 均值 ± 标准差、滚动统计、自动时间 locator |
| FFT | 去趋势、窗函数、单边振幅谱、AR(1) 红噪声 Monte-Carlo 阈值 |
| Quiver | 按版面英寸控制箭头长度、quiverkey、按密度取 stride |
| 色标 | cmocean 映射、TwoSlopeNorm、LogNorm、BoundaryNorm、色标截取 |
| 数据准备 | xarray 维度统一、区域裁剪、跨日界线、降序纬度、2D 坐标 |
| 期刊预设 | AGU / AMS / Elsevier / Nature / generic 的栏宽与字号 |
| 出图 QA | 刻度重叠检测、画布越界检查、色盲/灰度近似筛查 |
| 可复现 | --self-test、pytest、GitHub Actions、依赖文件 |
安装
方式 A:作为 DSH / Agent Skill
DSH 通过目录发现 skill,不是 dsh plugin add:
<project>/.dsh/skills/oceanography-plotting-style/SKILL.md
或全局:
~/.dsh/skills/oceanography-plotting-style/SKILL.md
把本仓库克隆/复制到上述目录即可。SKILL.md 在仓库根目录,所以可以直接把仓库目录作为 skill 目录。
git clone https://github.com/Char0nChengg/oceanography-plotting-style.git \
.dsh/skills/oceanography-plotting-style
加载后可用 /oceanography-plotting-style 调用(具体命令取决于客户端),模型也会根据 description 自动路由。
方式 B:作为 Python 包
python -m pip install -e ".[full]"
最小依赖(只用 ocean_plot 的基础功能):
python -m pip install -e .
Windows 上建议用 conda 装 Cartopy:
conda env create -f environment.yml
conda activate oceanography-plotting-style
快速开始
下面的例子用 .[full] 依赖(Cartopy、cmocean、xarray)。
from pathlib import Path
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
from ocean_data import grid_arrays, load_for_plot
from ocean_plot import (
add_map_features, add_panel_label, auto_tick_step, check_figure,
get_cmap, save_figure, set_degree_ticks, set_ocean_style, validate_grid,
)
from ocean_journal import get_journal, apply_journal_style
journal = get_journal("agu")
set_ocean_style(base_size=journal.body_pt)
apply_journal_style(journal.key) # 顺序不能反:覆盖 journal 线宽
lon_min, lon_max = 112.0, 132.0
lat_min, lat_max = 17.0, 32.5
fig_width = journal.width_in("double")
换成你的文件;地图这里显式取第一帧
da = load_for_plot(
"data/ssh.nc", "ssh",
region={"lon": (lon_min, lon_max), "lat": (lat_min, lat_max)},
)
frame = da.isel(time=0) if "time" in da.dims else da
lon, lat, ssh = grid_arrays(frame)
validate_grid(lon, lat, ssh)
fig, ax = plt.subplots(
figsize=(fig_width, 4.8),
subplot_kw={"projection": ccrs.PlateCarree()},
constrained_layout=True,
)
projection = ccrs.PlateCarree()
mesh = ax.pcolormesh(
lon, lat, ssh, cmap=get_cmap("cmo.dense"),
vmin=0, vmax=0.3, shading="auto",
transform=projection, rasterized=True,
)
ax.set_extent([lon_min, lon_max, lat_min, lat_max], crs=projection)
add_map_features(ax, scale="50m")
step_x, step_y = auto_tick_step(
lon_min, lon_max, lat_min, lat_max,
figsize=(fig_width, 4.8), fontsize=journal.tick_pt,
)
set_degree_ticks(ax, [lon_min, lon_max, lat_min, lat_max],
lon_step=step_x, lat_step=step_y)
ax.set_aspect("equal")
add_panel_label(ax, "(a)")
cbar = fig.colorbar(mesh, ax=ax, extend="neither")
cbar.set_label("SSH amplitude (m)")
for issue in check_figure(fig, check_bounds=True):
print("layout warning:", issue)
save_figure(
fig, Path("figures/Fig_01.png"), dpi=journal.dpi,
also_pdf=True, tight=False,
)
上面的片段默认存在 data/ssh.nc,并显式取第一帧;请换成自己的文件和时间选择。模板版见 templates/map_panel_grid.py。
运行模板
3×2 地图
python templates/map_panel_grid.py --demo
地图 + 时间序列 + 垂向剖面
python templates/mixed_panel_grid.py --demo
不带 --demo 会直接退出,提醒你替换合成数据。
数据准备
from ocean_data import canonicalize_dims, subset_region, pick_var, grid_arrays
ds = canonicalize_dims(ds)
ds = subset_region(ds, lon_bounds=(112, 132), lat_bounds=(17, 32.5))
da = pick_var(ds, "ssh")
lon, lat, data = grid_arrays(da)
- 支持 1D 规则经纬度和 2D 曲线经纬度,grid_arrays() 不要求坐标名等于维度名;
- 1D 跨日界线/负经度会返回单调展开的 0–360° 坐标(可能 >360),需配 central_longitude=180 或等价投影;
- 2D 曲线坐标只做布尔掩膜,保留原生坐标,不会 unwrap 或排序;
- 全图范围 (-180, 180) / (0, 360) 不会裁掉经度;
- load_for_plot() 默认保留时间维,不会静默 isel(time=0)。
谱分析
python
from ocean_spectral import fft_amplitude, ar1_threshold, dominant_period
freq, amp = fft_amplitude(x, dt=1.0, detrend="linear", window="hann")
result = ar1_threshold(x, dt=1.0, confidence=0.95, n_sim=500, seed=0)
period = dominant_period(freq, amp)
AR(1) 阈值是明确的零假设检验:先拟合红噪声,再做 Monte-Carlo 模拟。它不是万能的显著性检验,方法部分要写清楚。
色标与可访问性 python from ocean_access import accessibility_report
report = accessibility_report("cmo.balance")
print(report["warnings"])
- 灰度亮度间隔检查;
- 近似 deuteranopia / protanopia 模拟;
- 结果是筛查,不是无障碍认证。
期刊预设
| key | 适用 | 单栏 | 双栏 | 正文字号 |
| generic | 通用 | 89 mm | 183 mm | 8 pt |
| agu | AGU / JGR / GRL | 89 mm | 180 mm | 8 pt |
| ams | AMS | 85 mm | 178 mm | 8 pt |
| elsevier | Elsevier | 90 mm | 190 mm | 8 pt |
| nature | Nature 系列 | 89 mm | 183 mm | 6 pt |
这些是作者实践中的实用默认值,不是期刊官方模板;不同期刊、不同年份的指南会变化(例如 Nature 的 6 pt),投稿前必须核对最新 author guidelines。
python
from ocean_journal import get_journal, figure_size, apply_journal_style
style = get_journal("ams")
w, h = figure_size("ams", "double", height_mm=200)
apply_journal_style("ams")
项目结构 text . ├── SKILL.md # Agent Skill 入口 ├── README.md # 中文介绍 ├── README.en.md # English introduction ├── CHANGELOG.md ├── references/ │ ├── style-reference.md # 字体、版面、地图、色标、验收 │ ├── data-prep.md # xarray、区域、经度、滤波 │ └── figure-recipes.md # Hovmöller、剖面、FFT、quiver ├── scripts/ │ ├── ocean_plot.py # 刻度、地图、色标、QA、保存 │ ├── ocean_data.py # 维度统一、区域裁剪、变量选择 │ ├── ocean_spectral.py # FFT + AR(1) 阈值 │ ├── ocean_journal.py # 期刊预设 │ └── ocean_access.py # 灰度/CVD 筛查 ├── templates/ │ ├── map_panel_grid.py │ └── mixed_panel_grid.py ├── tests/ ├── docs/ │ ├── style-philosophy.md # 设计立场(中文) │ ├── style-philosophy.en.md │ └── assets/ └── .github/workflows/ ├── ci.yml └── release.yml
测试与验证 bash
python scripts/ocean_plot.py --self-test
python -m pytest -q
已在以下环境实际渲染验证:
- Python 3.13.9(Anaconda base)
- Matplotlib 3.10.6
- Cartopy 0.25.0
- cmocean 3.0.3
- xarray 2025.10.1 / scipy 1.16.3 / pandas 2.3.3
CI 在 Ubuntu + Python 3.10/3.12/3.13 上安装 Cartopy,运行测试、self-test、两个模板,并构建/检查 wheel 与 sdist。
已知边界
- 主要支持规则 1D 和 2D 曲线经纬度;不直接支持 ROMS 交错网格、非结构三角网格、投影坐标(m/km)的自动转换。
- 期刊栏宽/字号是经验值,不能替代最新投稿指南。
- auto_tick_step() 仍是启发式;check_figure() 会抓实际刻度重叠,但不做图像 diff。
- set_degree_ticks() 只支持 PlateCarree/Mercator 等矩形投影;LCC/Robinson 等请用 gridlines(draw_labels=True)。
- CVD 矩阵是近似;正式投稿前建议用专用工具复核。
- AR(1) 阈值只有一个红噪声零假设;复杂谱峰需问题特定的检验。
- Natural Earth 数据首次使用会下载;离线环境需提前缓存。
- 模板数据全部是合成的,必须替换;--demo 是防误用开关。
- pip install 安装的是 Python 模块;SKILL.md、references/ 和 templates/ 通过仓库/skill 目录分发,不进入 wheel。
- tight=True 会改变成品物理尺寸;论文交付使用 tight=False 并在保存前做画布检查。
贡献
欢迎提交 issue / PR,尤其是:
- 新的期刊预设;
- 非结构网格或投影坐标示例;
- 真实数据(可公开)的端到端示例;
- 视觉回归基线。
请确保 python -m pytest -q 通过,并附上渲染后的 PNG。
License
MIT。见 LICENSE。版本历史见 CHANGELOG.md。
引用
如果这个项目帮到了你的论文,可以在方法/致谢中提及:
Figures were prepared with the oceanography-plotting-style toolkit (Char0nChengg, 2026), built on Matplotlib, Cartopy and cmocean.预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Char0nChengg/oceanography-plotting-style
物理海洋学论文图的「可复用绘图规范 + 代码工具箱」。既是 DeepSeek Harness / Agent…
相关插件 · 视觉能力
智能体工作台Devin-AXIS/iPolloWork
企业级、本地优先的智能体工作台,面向个人和智能体团队——一个工作区,容纳多个智能体引擎;一套统一体系,管理插件和技能;支…
★ 7,332已汉化DSH
72
开源设计工作台nexu-io/open-design
OpenDesign:首个协作式 AI 设计智能体工作区
★ 105,153已汉化DSH
71.8
多智能体编码工作区spacering-net/codeg
多智能体协作的 AI 编程工作区:汇总 Claude Code、Codex、OpenCode、Pi、Grok Build 等来源的会话。支持桌面应用、自托管服务器或 Docker。
★ 4,244已汉化DSH
71.6
GPT 图像提示词库freestylefly/awesome-gpt-image-2
Prompt as Code | GPT Image 2 / 2.5 提示词与案例库,530+ 个案例、20+…
★ 34,534已汉化DSH
71.5
架构图生成器tt-a1i/archify
把你想理解、规划或分享的事,变成可以互动的可视化作品。
★ 92,046已汉化DSH
71.1
AI 用量桌面小部件Javis603/token-monitor
EN | 简 | 繁 | KO | JA | PT
★ 3,480已汉化DSH
71