尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Astropy 与 Matplotlib 深度集成:Quantity 带单位数据与 Time 时间序列绘图实战
科学计算科研数据分析【免费下载链接】astropyAstronomy and astrophysics core library项目地址https://gitcode.com/gh_mirrors/as/astropy点击查看免费下载本文以 Astropy 官方文档 docs/visualization/matplotlib_integration.rst 为核心骨架系统讲解astropy.visualization为 Matplotlib 提供的两类核心绘图增强quantity_support()带单位 Quantity 绘图与time_support()天文时间 Time 绘图。读完本文你将掌握如何让 Matplotlib 自动识别并转换物理单位、自动格式化天文时间轴刻度以及如何结合源码理解其底层转换器converter与刻度定位/格式化机制直接用于科研数据可视化与论文图表绘制。astropy.visualization模块是 Astropy 的通用可视化工具箱除了本文重点的 Matplotlib 集成外还涵盖天文图像坐标绘制wcsaxes、图像归一化与拉伸、智能直方图、RGB 彩色合成以及自定义绘图样式详见 docs/visualization/index.rst。其中单位与时间的绘图支持由 astropy/visualization/units.py 和 astropy/visualization/time.py 两个模块实现二者均基于 Matplotlib 的ConversionInterface单位转换框架在 Matplotlib 的units.registry中注册对应的转换器。一、Plotting quantities直接绘制带单位的数据Quantityastropy.units.Quantity是 Astropy 表示“数值 物理单位”的核心对象。在不做任何配置时直接把Quantity传给 Matplotlib 的plot()等函数会报错或得到无意义的裸数值。Astropy 提供了一个显式开启的开关quantity_support()from astropy.visualization import quantity_support quantity_support()调用后会返回一个astropy.visualization.units.MplQuantityConverter ...转换器实例。此后Quantity对象就可以直接传给 Matplotlib 的各种绘图函数且坐标轴标签会自动带上该轴的单位from astropy import units as u from astropy.visualization import quantity_support from matplotlib import pyplot as plt quantity_support() fig, ax plt.subplots(figsize(5, 3)) ax.plot([1, 2, 3] * u.m)运行这段代码y 轴标签会显示为m米刻度数值即为数据的原始数值。1.1 单位自动换算以“轴上第一个单位”为准启用quantity_support()后同一坐标轴上后续绘制的数据会自动换算到该轴已确定的单位。默认单位取自第一次在该轴绘图时遇到的 Quantity 单位。例如下面的代码第一条线是m第二条线虽然以cm给出但会被自动换算为my 轴仍然保持m不变ax.plot([1, 2, 3] * u.cm) # 100 cm 自动换算为 1 my 轴单位仍为 m这种“首遇单位决定轴单位”的行为由转换器的default_units逻辑决定见 astropy/visualization/units.py当数据对象具有unit属性时直接返回该单位当传入的是“可迭代且首元素带单位”的对象如[1, 2, 3] * u.m生成的数组时返回首元素的单位纯数值列表则返回None。而convert方法units.py则调用Quantity.to_value(unit)完成实际换算——这也是单位兼容性检查发生的地方。1.2 显式锁定轴单位Axis.set_units()如果你希望对某个轴的单位拥有完全控制权可以显式指定ax.yaxis.set_units(u.cm)例如当你想让 y 轴固定显示为厘米时执行上面这句即可。轴单位一旦显式设置就不再受数据本身的单位或绘图顺序影响——无论后续传入m、cm还是km的数据都会统一换算并显示为cm。这一机制与 Matplotlib 原生matplotlib.axis.Axis.set_units完全一致Astropy 只是让Quantity接入了这套标准接口。1.3 单位不兼容时的异常行为向一个已确定长度单位的轴如上面的m绘制质量单位的数据会直接抛出异常ax.plot([1, 2, 3] * u.kg) # ValueError / ConversionError质量无法换算为长度因为kg与m维度不兼容无法完成to_value()换算。该行为在测试 astropy/visualization/tests/test_units.py 中通过pytest.raises(ConversionError)明确验证。1.4 临时开启with上下文管理器MplQuantityConverter同时实现了ContextDecorator见 units.py因此既可以直接调用也可以作为上下文管理器临时生效。上下文退出时会自动恢复 Matplotlib 在注册表中的原始转换器若原来没有则删除注册保证代码块结束后单位支持被完整关闭with quantity_support(): ax.plot([1, 2, 3] * u.m)它同样可以当作函数装饰器使用。测试 test_units.py 展示了quantity_support()装饰器用法并支持嵌套内层退出后外层转换器自动恢复见 test_nested。1.5 源码剖析MplQuantityConverter与坐标轴格式化quantity_support()返回的实例本质是一个MplQuantityConverter子类其核心工作由三个静态方法完成units.pyaxisinfo(unit, axis, formatNone)返回matplotlib.units.AxisInfo用于定制刻度的定位器locator、格式化器formatter与轴标签文本convert(val, unit, axis)将 Quantity 数值换算为轴单位下的纯数值default_units(x, axis)从第一个数据对象推断轴默认单位。axisinfo中针对角度单位做了专门的美化处理units.py弧度radian主刻度定位器使用MultipleLocator(basenp.pi/2)并配以把π/2、π、3π/2等显示为数学符号的FuncFormatter。测试 test_radian_formatter 验证了刻度标签为[π/2, π, 3π/2, 2π, ...]度degree使用AutoLocator加FormatStrFormatter(%g°)刻度自动以°后缀显示其他单位轴标签通过unit.to_string(format)生成。quantity_support()还接受一个可选参数format用于控制轴标签的渲染格式units.pyquantity_support(formatconsole) # 轴标签显示为 erg s^-1 cm^-2 quantity_support(formatlatex_inline) # 默认值显示为 LaTeX 风格若未指定默认使用模块级常量_default_format latex_inlineunits.py。测试 test_axisinfo_label 分别验证了NoneLaTeX与console两种格式下的标签输出。此外该支持对Quantity子类如Angle同样生效参见 test_quantity_subclass。二、Plotting times直接绘制天文时间TimeMatplotlib 原生提供日期/时间轴绘制机制通过plot_date数据或在轴上注册 datetime 转换器但天文科研中大量使用的是 Astropy 的Time对象其包含丰富的时标scale与时间格式formatMatplotlib 并不认识。为此 Astropy 提供了time_support()from astropy.visualization import time_support time_support()调用后会返回astropy.visualization.units.MplTimeConverter ...注意这是astropy.visualization.time模块内部定义的转换器类实际类名为MplTimeConverter。启用后即可直接绘图且轴标签会自动格式化为 Time 风格的标签from matplotlib import pyplot as plt from astropy.time import Time from astropy.visualization import time_support time_support() fig, ax plt.subplots(figsize(5, 3)) ax.plot(Time([58000, 59000, 62000], formatmjd), [1.2, 3.3, 2.3])2.1 格式与时标默认取“第一个 Time”也可显式指定默认情况下轴上的时间格式format与时标scale取自 Matplotlib 在某个坐标轴实例上遇到的第一个Time对象——即Time([58000, 59000, 62000], formatmjd)决定 x 轴按 MJD 格式显示。这一推断发生在MplTimeConverter.default_units中time.py当format/scale未显式设置时从第一个Time对象的x.format与x.scale属性自动读取。如需对格式与时标进行完全控制可给time_support显式传参time_support(formatmjd, scaletai) fig, ax plt.subplots(figsize(5, 3)) ax.plot(Time([50000, 52000, 54000], formatmjd), [1.2, 3.3, 2.3])这样无论传入数据的原始格式与时标是什么轴都会按mjd格式、tai时标显示。time_support的完整签名与参数语义见 time.pyscale轴使用的时间尺度默认取第一个 Time 的 scaleformat轴使用的时间格式默认取第一个 Time 的 formatsimplify尽可能简化刻度标签例如当所有标签都落在整点时从 ISO 字符串中去除00:00:00.000时间部分默认True。同样地可以用with语句实现临时启用退出后自动恢复注册表状态with time_support(formatmjd, scaletai): fig, ax plt.subplots(figsize(5, 3)) ax.plot(Time([50000, 52000, 54000], formatmjd))2.2 支持的格式与限制time_support对格式的支持有明确边界time.pyUNSUPPORTED_FORMATS (datetime, datetime64) YMDHMS_FORMATS (fits, iso, isot, yday) STR_FORMATS YMDHMS_FORMATS (byear_str, jyear_str)字符串型日历格式fits、iso、isot、yday及byear_str、jyear_str会由AstropyTimeFormatter专门格式化为可读时间文本数值型格式mjd、jd、unix、cxcsec、gps、decimalyear、byear、jyear、plot_date等则直接以数值刻度呈现若显式传入datetime或datetime64formatsetter 会直接抛出ValueError(time_support does not support format...)time.py。测试 test_formats 覆盖了上述全部格式的刻度输出例如iso输出2020-01-01 00:00:00.000、mjd输出60000、byear_str输出B2020.000、yday输出2020:001:00:00:00.000等并验证轴标签为Time (format)。simplifyTrue时test_formats_simplifyiso/fits/isot会去掉整点的时分秒后缀yday会化简为纯年份使长跨度的图表更清爽。2.3 源码剖析刻度定位器与格式化器MplTimeConvertertime.py是接入 Matplotlib 的转换器本体其axisinfo返回自定义的AstropyTimeLocator刻度定位器与AstropyTimeFormatter刻度格式化器并设置轴标签fTime ({self.scale})。convert方法根据目标格式把Time换算成对应的标量或数组YMDHMS 类格式换算为scaled.mjdMJD 数值byear_str/jyear_str分别换算为byear/jyear其余格式直接取getattr(scaled, self.format)。AstropyTimeLocatortime.py继承了 Matplotlib 的MaxNLocator默认nbins4并按时间跨度自适应选择刻度步长跨度超过一年按整年取刻度步长由select_step_scalar选取“漂亮”的整数跨度在月到年之间按整月取刻度并处理跨年月份偏移跨度在一天到一个月之间退化为steps[1, 2, 5, 10]的标准数值刻度跨度小于一天由select_step_hour计算以“小时角”为单位的合理步长这两个步长选择工具位于 astropy/visualization/wcsaxes/utils.py。测试 test_formatter_locator 用 12 组从“几十年”到“亚秒”的典型区间验证了这套定位/格式化组合例如跨度几十年时刻度为[2020-01-01, 2040-01-01, 2060-01-01]跨度几小时时刻度精确到分钟级时间戳。AstropyTimeFormattertime.py则负责把刻度数值还原为Time并调用对应的格式方法生成标签文本getattr(times, format)同时关闭科学计数法与偏移量set_useOffset(False)、set_scientific(False)避免长年份区间出现2e3之类的非时间标签。三、工程实践要点先开启再绘图quantity_support()与time_support()都是“显式开启”的设计需要在调用任何 matplotlib 绘图函数之前执行二者的完整 API 均从astropy.visualization顶层导出见 astropy/visualization/init.py。优先使用with语句在交互式会话或长脚本中用上下文管理器包裹绘图代码可以避免转换器状态泄漏到后续代码嵌套使用时内部退出会自动恢复外部注册状态测试 test_nested 验证了嵌套时格式互不干扰。单位与格式的确定性若想保证图表输出的单位/时间格式完全可控请显式使用ax.yaxis.set_units(u.cm)、time_support(format..., scale...)而不要依赖“首个数据决定”的默认推断。依赖要求两个功能都依赖 Matplotlib 环境。仓库代码中通过HAS_MATPLOTLIB做了条件导入在未安装 Matplotlib 时MplQuantityConverter会退化为直接抛ImportError的占位类units.py相关测试也以pytest.mark.skipif(not HAS_PLT, ...)跳过见 test_units.py。四、小结借助quantity_support()与time_support()Astropy 把“物理单位”和“天文时标”无缝接入 Matplotlib 的单位转换框架前者让Quantity的轴标签自动带单位、同轴数据自动换算、角度轴获得 π 符号刻度后者让Time对象按天文人习惯的格式与时标呈现并配有跨年/跨月/跨天/亚天的多级自适应刻度算法。两者的实现都可在 astropy/visualization/units.py 与 astropy/visualization/time.py 中完整追溯对应的行为契约则由 test_units.py 与 test_time.py 中的数十个参数化用例精确锁定可作为日常绘图的可靠参考。赞分享科学计算科研数据分析【免费下载链接】astropyAstronomy and astrophysics core library项目地址https://gitcode.com/gh_mirrors/as/astropy点击查看免费下载相关推荐Chart.js Time Scale 实战用时间轴绘制带日期数据的时间序列折线图Chart.js Time Scale 实战用时间轴绘制带日期数据的时间序列折线图 Chart.js 的 Time Scale时间轴专用于展示日期与时间数图表库前端数据可视化Astropy Modeling 单位支持实战指南Quantity 参数、单位拟合与 coerce_units 机制Astropy Modeling 单位支持实战指南Quantity 参数、单位拟合与 coerce_units 机制 astropy.modeling 是 A科学计算科研数据分析astropy 时间序列中的时间表示与转换Time/TimeDelta 的格式、时标与相对时间实践astropy 时间序列中的时间表示与转换Time/TimeDelta 的格式、时标与相对时间实践 本文基于 astropy 官方文档 Converting科学计算科研数据分析上一篇从特征提取到图像嵌入RepVGG_b2.rvgg_in1k的多场景应用指南下一篇如何永久保存微信聊天记录这个开源工具让你轻松备份和分析所有对话创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

COMSOL多物理场仿真:流化床氧化铁催化与铁粉颗粒生成建模

COMSOL多物理场仿真:流化床氧化铁催化与铁粉颗粒生成建模

最近在弄一个和 COMSOL 多物理场仿真相关的项目:流化床里氧化铁颗粒既要作为催化剂参与气相反应,又要在还原气氛下逐步转变成铁粉颗粒。这类问题在单篇文章里很少见到完整讲法,多数文献要么只算流化床流态化,要么只做固定床催化反…

📅 2026/10/14 20:20:41
无机非金属材料生态化改造:原料替代、燃料替代与工艺优化路径

无机非金属材料生态化改造:原料替代、燃料替代与工艺优化路径

简介:这份PDF资料聚焦无机非金属类生态环境材料,面向材料科学专业师生、无机非金属材料科研人员及关注环保材料与循环经济的工程师。内容从材料概述切入,梳理传统无机非金属材料能耗高、难再循环、固体废弃物处理难等生态问题,进而…

📅 2026/10/14 20:20:41
vllm-ascend 实验性 Model Runner V2 适配指南:Ascend 特有逻辑与上游 vLLM 差距全解析

vllm-ascend 实验性 Model Runner V2 适配指南:Ascend 特有逻辑与上游 vLLM 差距全解析

人工智能大模型模型推理服务AscendCANN 【免费下载链接】vllm-ascend Community maintained hardware plugin for vLLM on Huawei Ascend 项目地址: https://gitcode.com/gh_mirrors/vl/vllm-ascend 点击查看 免费下载 导读 本文以 vllm-ascend 仓库中 Model Runn…

📅 2026/10/14 20:15:40
MORE NEWS

更多资讯

📰

2026年Docker还值得学吗?学习重点已变

说实话,这个问题每隔一两年就会有人问一次。从“学 Docker 还有没有前途”到“Kubernetes 是不是已经把 Docker 干掉了”,再到 2026 年这个节骨眼上,大家反复纠结的其实不是技术本身,而是怕自己投入时间之后学到的东西很快就过期。…

📰

30天倒计时:如何用时间约束为验收环境装上质量门禁

测试员这行干久了,心态再稳的人也会遇到几个逼得你想“动手”的场景。我印象最深的,是某个跨平台客户端项目进入验收阶段后,验收环境挂了三周,脚本跑了几轮,功能点却还有一大半没覆盖到。管理层看到“验收环境在线”就…

📰

无sudo无npm?三步在受限服务器部署Claude命令行工具

1. 限制边界:没有 sudo、没有 npm 不等于没法部署 Claude先给结论:只要你的账号在服务器上有可写的用户目录,并且能执行文件,那么即使没有 sudo,也没有全局 npm,一样能把 Claude 官方命令行工具装好、跑起来…

📰

TP301系列DTU配置与调试:从串口转网络到故障排查的完整指南

简介:TP301系列DTU使用说明是一份面向物联网现场工程师与设备调试人员的官方技术文档,适用于工业自动化、智能农业、环境监测等场景的无线数据采集与传输项目。压缩包内含1个PDF文件,大小仅2.15MB,正文围绕产品接口、配置工具、平…

📰

面向对象程序设计-第一阶段补充-教材6-3:自定义函数实现有序数组的删除

作者 陈春丽单位 中国地质大学(北京)从一个有序数组(由小到大)中删除一个数据。如数组a{1,3,5,7,9},删除3后的a是{1,5,7,9},长度减1(不会释放数组内存)。如果要删除的数据不在数组中…

📰

Adobe Premiere Pro 2025新特性与安装优化指南

1. Adobe Premiere Pro 2025 版本核心特性解析作为视频剪辑行业的标杆软件,Adobe Premiere Pro每年的大版本更新都会带来颠覆性改进。2025版本在引擎底层进行了全面重构,实测项目渲染效率比2024版提升40%以上。最值得关注的是新增的AI智能剪辑助手&#…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬