图 1. 作者在今年比赛中分发的 Riverlands 地图照片。
今年我跑了大约 60 英里的路程,并使用 GPS 记录了我的进度。我从Strava获得了 GPX 格式的录音笔录。地图在我的脑海中,比赛在我的想象中焕然一新,我要求 ChatGPT 对我在缅因州荒野度过的周末的各种图表进行“切片和切块”。下面讨论最有趣的一对图。
我使用ChatGPT-4o和代码解释器来撰写本文。
首先,我向 ChatGPT-4o 提示我的 GPX 数据和请求,如图 2 所示。请求是三个图:
- “地图可视化”图
- 具有纬度对齐的时间线
- 经度对齐的时间线
该提示还包括一个编码技巧 – 其作用的详细说明请参见附录 1。
图 2. 作者的屏幕截图。提示 ChatGPT-4o 生成三个 GPX 数据图。
下面提供了 ChatGPT 为图 3 中的图生成的代码。该 Python 脚本在 ChatGPT 代码解释器中运行以生成绘图。
import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdates import matplotlib.colors as mcolors import gpxpy from datetime import datetime import numpy as np # 解析 GPX 文件 gpx_file_path = '/mnt/data/Riverlands_100_2024.gpx' with open (gpx_file_path, 'r' ) as file: gpx = gpxpy.parse(file) # 提取轨迹点 data = [] for track in gpx.tracks: for segment in track.segments: for point in slot.points: data. append([point.time, point.latitude, point.longitude, point.elevation]) # 创建一个 DataFrame df = pd.DataFrame(data, columns=[ 'time' , 'latitude' , 'longitude' , 'elevation' ]) # 计算经过的时间(以秒为单位) df[ 'elapsed_time' ] = (df[ 'time' ] - df[ 'time' ].iloc[ 0 ]).dt.total_seconds() # 计算点之间的距离 df[ 'distance ' ] = np.sqrt((df[ 'latitude' ].diff()** 2 ) + (df[ 'longitude' ].diff()** 2 )) * 111000 # 纬度/经度到米的近似转换 df[ 'distance' ].fillna( 0 , inplace= True ) # 计算速度(MPH) df[ 'time_diff' ] = df[ 'elapsed_time' ].diff().fillna( 0 ) df[ 'pace_mph' ] = ( df[ 'distance' ] / df[ 'time_diff' ]) * 2.23694 # 米每秒换算为英里每小时 # 标准化颜色映射的步速(剪辑值为 6 MPH) df[ 'pace_mph_clipped' ] = df[ 'pace_mph' ] .clip( 0 , 6 ) # 定义颜色贴图 time_cmap = plt.get_cmap( 'viridis' ) pace_cmap = plt.get_cmap( 'coolwarm' ) # 创建经过时间和步速的颜色数组 time_norm = mcolors.Normalize(vmin=df[ 'elapsed_time' ]. min (), vmax=df[ 'elapsed_time' ]. max ()) pace_norm = mcolors.Normalize(vmin= 0 , vmax= 6 ) time_colors = time_cmap(time_norm(df[ 'elapsed_time' ])) pace_colors =pace_cmap(pace_norm(df[ 'pace_mph_clipped' ])) # 绘制经过时间的地图可视化 Fig, ax = plt.subplots( 3 , 1 , Figsize=( 15 , 15 )) # 地图可视化 ax[ 0 ].scatter(df[ 'longitude' ], df[ 'latitude' ], c=time_colors, s= 10 , label= '轨迹点' ) ax[ 0 ].set_title( '地图可视化(经过时间)' ) ax[ 0 ].set_xlabel( '经度' ) ax[ 0 ].set_ylabel( '纬度' ) # 具有纬度对齐的时间进度 scatter_lat = ax[ 1 ] .scatter(df[ 'elapsed_time' ], df[ 'latitude' ], c=pace_colors, s= 10 , label= '轨迹点' ) ax[ 1 ].set_title( '纬度对齐的时间进程' ) ax[ 1 ].set_xlabel( '经过时间 (s)' ) ax[ 1 ].set_ylabel( '纬度' ) Fig.colorbar(scatter_lat, ax=ax[ 1 ],orientation= '垂直' , label= '步速 (MPH)' ) # 经度对齐的时间进度 scatter_lon = ax[ 2 ].scatter(df[ 'elapsed_time' ], df[ 'longitude' ], c=pace_colors, s= 10 , label= 'Track Points' ) ax[ 2 ]. set_title( '经度对齐的时间进度' ) ax[ 2 ].set_xlabel( '经过的时间(秒)' ) ax[ 2 ].set_ylabel( '经度' ) Fig.colorbar(scatter_lon, ax=ax[ 2 ],orientation = '垂直',label= '配速(MPH)' ) plt.tight_layout() plt.show()
请注意,ChatGPT 使用的上述代码并不试图消除其步速计算中的 GPS 抖动;这是一个不同的练习。其影响是随后的步速数据应该在高水平上进行解释。
图 3. 作者的屏幕截图。 ChatGPT 根据图 2 中的提示生成的图。纬度和经度对齐时间线按速度进行颜色编码 — 红色较快,蓝色较慢。右侧颜色条不准确 — 应该是 0-6 英里/小时。
讨论
与往常一样,在阅读 ChatGPT 结果时需要谨慎。通常,详细信息可能包含错误,并且会因会话而异。例如,在此处描述的会话中,颜色条被错误标记。尽管如此,如果您保持谨慎并交叉比较多个会话的结果(并在此过程中改进提示等),您可以获得真正的见解。
我发现图 3 的图很微妙,而且信息量惊人。
图 3(地图可视化)中的第一个图有效地传达了我的比赛如何结束。它可视化了我在缅因州特纳的安德罗斯科金河地州立公园的路线。绘制的路线是根据沿路线覆盖两个半环(往返)的数据构建的。第三圈时,我转了大约一半,回到了“中土援助站”(查看地图了解其地理位置——图1),那里的录音被关闭了。图 5 捕捉到了这种动态。参见图 4。
图 4。作者突出显示了中土救援站(圆圈)处的周转和终点。
图 3 中底部的一对图(纬度对齐和经度对齐时间线)有效地传达了比赛最后三分之一的配速如何下降 – 由蓝色编码段数量的增加表明。情节的内部结构信息丰富。我可以将蓝色线段与地图(图 1)或 Strava 中的位置(图 6)相关联。
例如,图 5 突出显示了我在开始/结束时停了一个多小时(胃部不适)的地方。请参阅图 1 中的地图,了解“开始/结束”的地理位置。其他以蓝色为主的部分对应于我记得我停下来的位置和时间。例如,我可以将这些片段与 Strava 中的位置进行比较 – 请参阅图 6 或返回地图 – 图 1,或图 3 中的地图可视化。
图 5. 作者的屏幕截图。带有突出显示的绘图显示了作者在比赛期间在起点/终点处停留了一个多小时的位置。
纬度和经度图提供同一时间线的不同视图。所描绘的速度信息在两者之间相关——红色和蓝色沿着时间线对齐。但“侧重点”却有所不同。例如,经度对齐图更详细地描绘了红色和蓝色部分(更快和更慢的节奏)。这是有道理的;总体而言,该路线在经度上覆盖的距离比在纬度上覆盖的距离更长(想象一下投影到这些轴上的路线)。然而,并非所有地点都是如此。这样,在这两种视角之间,人们就能更全面地了解我的曲折旅程的结构。
图 6. 作者的屏幕截图。 Strava 显示路线。
正如前面所提到的,ChatGPT 计算的步速信息在细节上可能不准确,但是,我相信在摘要中它是有用的。例如,绘图(图 3 和图 5)中的红色可能比应有的多,但可以准确地说,我在比赛前半段的移动速度比后半段快得多。
总的来说,在 ChatGPT 中处理比赛数据是一项刺激的练习,可以揭示洞察力。这是“假设”你的比赛日体验的好方法。但是,您应该谨慎解释 ChatGPT 告诉您的内容。
参考
此处使用的作者与 ChatGPT 的交流文字可在以下链接中找到(但请注意,ChatGPT 目前不共享代码解释器生成的图形数据):
- https://chat.openai.com/share/4dbe0bbf-32a5-4c42-b575-6cc1af9b3b56
- https://chat.openai.com/share/5c46f087-cb07-4dae-b5c0-3ad300b26875
- ChatGPT-4o — https://openai.com/index/gpt-4o-and-more-tools-to-chatgpt-free/
- Strava — https://www.strava.com/
- Riverlands 100 和接力 — https://www.riverlands100.com/
附录 1 — 提示中编码提示的使用
在提示中添加编码提示类似于在Middlesex Fells Trail Analyzer Custom ChatGPT的“培训手册”中包含编码提示和代码示例。
它们指导 ChatGPT 的 Python 代码选择。在这种情况下,如果没有其他提示,ChatGPT 更有可能生成依赖于 gpxpy 模块的代码,从而导致在尝试在代码解释器中运行脚本时出现错误。
图 7. 作者的屏幕截图。 ChatGPT 的代码解释器因缺少 gpxpy 模块而出错。
虽然 ChatGPT 通常能够使用替代方法(基于直接解析 XML)修复其代码,但这会减慢响应速度。在极少数情况下,如果延迟很严重,则可能会结束会话。