如何基于Pandas DataFrame条件在Matplotlib Basemap上绘制不同样式轨迹?
解决Pandas Series真值歧义错误,实现基于温度的Basemap轨迹分段着色
首先明确说:没错,这个报错完全是Pandas Series的特性导致的。你直接在if语句里用datacopy['Ambient temp']<280,得到的是一个和原数据长度一致的布尔Series——每个元素对应该行温度是否小于280。但if需要的是单个布尔值(真/假),Pandas搞不清你是要判断「所有点温度都低于280」、「有任意一个点低于280」还是别的逻辑,所以就抛出了这个歧义提示。
接下来,因为我们要绘制的是连续轨迹,得按温度分段绘制相邻的点对,不能直接对整列判断后画整条线。这里给你两种实用的解决方法:
方法1:逐段遍历相邻点(简单直观)
这种方法适合快速实现,直接遍历每一对相邻的轨迹点,根据当前点的温度选择颜色绘制线段:
# 先把数据转成数组,方便遍历 lons = datacopy.long.values lats = datacopy.lat.values temps = datacopy['Ambient temp'].values # 遍历每一组相邻点 for i in range(len(lons)-1): # 用当前点的温度做判断(也可以用两点的平均温度) if temps[i] < 280: # 直接用latlon=True让Basemap自动转换坐标 map.plot([lons[i], lons[i+1]], [lats[i], lats[i+1]], 'r-', latlon=True, linewidth=2) else: map.plot([lons[i], lons[i+1]], [lats[i], lats[i+1]], 'b-', latlon=True, linewidth=2)
方法2:拆分连续温度段(更高效)
如果你的轨迹里有很长一段连续相同温度区间的点,这种方法会把连续的同温段作为一个整体绘制,减少绘图次数:
# 生成温度条件的布尔标记 is_cold = datacopy['Ambient temp'] < 280 # 找出温度条件变化的位置(相邻行标记不同的地方) change_points = is_cold.ne(is_cold.shift()).dropna().index # 拆分轨迹并绘制 start = 0 for point in change_points: # 取出当前连续段的经纬度 seg_lons = datacopy.long[start:point] seg_lats = datacopy.lat[start:point] # 根据段内第一个点的温度选择颜色 color = 'r-' if is_cold.iloc[start] else 'b-' map.plot(seg_lons, seg_lats, color, latlon=True, linewidth=2) start = point # 绘制最后一段剩余的轨迹 seg_lons = datacopy.long[start:] seg_lats = datacopy.lat[start:] color = 'r-' if is_cold.iloc[start] else 'b-' map.plot(seg_lons, seg_lats, color, latlon=True, linewidth=2)
两种方法都能实现你想要的「根据温度用不同颜色绘制轨迹片段」的效果,你可以根据自己的需求选择~
内容的提问来源于stack exchange,提问作者Bethany
相关产品推荐
相关产品推荐

