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),仅供参考

相关新闻

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

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

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

2026/10/14 20:20:38 阅读更多 →
无机非金属材料生态化改造:原料替代、燃料替代与工艺优化路径

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

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

2026/10/14 20:20:38 阅读更多 →
GmailQuickStart:半小时跑通IMAP收信与SMTP发信的邮件自动化骨架

GmailQuickStart:半小时跑通IMAP收信与SMTP发信的邮件自动化骨架

简介:这是一份面向Android开发者的Gmail API集成示例工程,基于GmailQuickStart项目,演示如何调用Gmail API获取用户未读邮件数与邮件总数,并展示在应用界面上。资源以rar压缩包形式发放,整体约26.86MB,内含…

2026/10/14 20:19:37 阅读更多 →

最新新闻

AI高薪风口来袭!小白程序员如何抓住机遇,收藏这份学习指南?

AI高薪风口来袭!小白程序员如何抓住机遇,收藏这份学习指南?

文章主要介绍了AI行业的薪资现状,从实习生日薪5000元到年薪上亿,AI人才市场正在经历一场白热化的争夺战。文章指出,AI正在“入侵”每一个行业,人才缺口超过500万,普通人有机会分到一杯羹。文章建议普通人通过系统学习掌…

2026/10/14 21:14:53 阅读更多 →
大厂校招薪资大揭秘:小白程序员必看,收藏这份热门岗位薪资指南!

大厂校招薪资大揭秘:小白程序员必看,收藏这份热门岗位薪资指南!

本文汇总了字节跳动、腾讯、阿里巴巴等热门大厂校招薪资情况,涵盖前后端开发、AI/Agent方向、测开等岗位。数据来源于往届案例及公开信息,详细展示了不同级别薪资待遇及福利。文章提醒求职者在选择Offer时,不仅要关注总包,还要了解…

2026/10/14 21:14:53 阅读更多 →
如何快速上手cad-viewer:10分钟在浏览器中打开你的第一份DWG/DWG图纸

如何快速上手cad-viewer:10分钟在浏览器中打开你的第一份DWG/DWG图纸

前端3D渲染图形学 【免费下载链接】cad-viewer The world’s first fully web-based DXF/DWG viewer and editor that runs entirely in the browser — no backend server required. 项目地址: https://gitcode.com/gh_mirrors/cad/cad-viewer 点击查看 免费下载 …

2026/10/14 21:14:53 阅读更多 →
大模型高薪诱惑:年薪百万?小白必看收藏!

大模型高薪诱惑:年薪百万?小白必看收藏!

一篇顶会一作AIGC方向211本硕,某短视频大厂算法岗月入4.5万,实际年薪或超百万。但需注意,高薪并非保底,且薪资构成复杂,包括签字费、期权等。大厂算法岗普通档薪资为26k-36k,该岗位薪资远超普通水平&#x…

2026/10/14 21:14:53 阅读更多 →
AI工程师两大门派:传统算法与AI大模型应用开发,收藏这份入门指南!

AI工程师两大门派:传统算法与AI大模型应用开发,收藏这份入门指南!

文章介绍了AI领域的两大门派:传统算法工程师和AI大模型应用开发工程师。前者是“基建狂魔”,通过数学和编程解决实际问题,如精准推荐、最优路线规划等;后者是“场景魔术师”,利用现成大模型解决业务落地难题&#xff0…

2026/10/14 21:14:53 阅读更多 →
阿里云短信签名模板审核避坑指南与Python调用实战

阿里云短信签名模板审核避坑指南与Python调用实战

简介:本资源是一份面向Java开发者的企业级短信集成实战示例,聚焦阿里云短信服务(Dysmsapi)的快速接入与稳定调用,适用于用户注册验证、密码重置、订单通知等典型业务场景。压缩包共92个文件,含68个C#源码文…

2026/10/14 21:13:53 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →