PyQtGraph自定义颜色映射:GPS轨迹速度着色及图例创建需求
解决GPS轨迹分段着色与图例创建问题
核心思路
由于matplotlib的plot()无法直接为折线的每一段分配不同颜色,你需要逐段绘制轨迹线段,再通过自定义图例或颜色条关联颜色与速度值。以下是两种可行方案,基于你已有的RGB颜色列表实现:
方案1:自定义离散图例(适合速度分区间场景)
如果你的速度是按区间划分(如<10km/h、10-20km/h、>20km/h),可以手动创建图例项:
import matplotlib.pyplot as plt from matplotlib.patches import Patch # 假设你已有的数据 lons = [116.3, 116.31, 116.32, 116.33] # 经度序列 lats = [39.9, 39.91, 39.92, 39.93] # 纬度序列 speeds = [5, 15, 25] # 每段线段的速度值 colors = [(0,1,0), (1,1,0), (1,0,0)] # 对应每段的RGB颜色 # 逐段绘制轨迹 for i in range(len(lons)-1): plt.plot([lons[i], lons[i+1]], [lats[i], lats[i+1]], color=colors[i], linewidth=2) # 定义速度区间与颜色的映射(根据你的实际区间调整) speed_labels = ["<10km/h", "10-20km/h", ">20km/h"] color_map = dict(zip(speed_labels, [(0,1,0), (1,1,0), (1,0,0)])) # 创建自定义图例 legend_elements = [Patch(facecolor=color_map[label], edgecolor='black', label=label) for label in speed_labels] plt.legend(handles=legend_elements, loc="upper right") plt.xlabel("经度") plt.ylabel("纬度") plt.title("GPS轨迹(按速度着色)") plt.show()
方案2:连续颜色条(适合速度连续变化场景)
如果速度是连续值,可通过ScalarMappable将RGB颜色映射到速度范围,生成标准颜色条:
import matplotlib.pyplot as plt from matplotlib.cm import ScalarMappable from matplotlib.colors import Normalize # 假设你已有的数据 lons = [116.3, 116.31, 116.32, 116.33] lats = [39.9, 39.91, 39.92, 39.93] speeds = [5, 15, 25] colors = [(0,1,0), (1,1,0), (1,0,0)] # 逐段绘制轨迹 for i in range(len(lons)-1): plt.plot([lons[i], lons[i+1]], [lats[i], lats[i+1]], color=colors[i], linewidth=2) # 创建颜色映射的归一化与ScalarMappable norm = Normalize(vmin=min(speeds), vmax=max(speeds)) sm = ScalarMappable(norm=norm, cmap=None) sm.set_array(speeds) # 手动设置颜色映射(匹配你的RGB列表) sm.cmap = plt.cm.colors.ListedColormap(colors) # 添加颜色条 cbar = plt.colorbar(sm, ticks=speeds) cbar.set_label("速度 (km/h)") plt.xlabel("经度") plt.ylabel("纬度") plt.title("GPS轨迹(按速度着色)") plt.show()
关键注意事项
- 确保每段线段的颜色与速度值一一对应,
colors列表长度需等于len(lons)-1(即线段数量)。 - 若使用静态颜色-值对应图,可单独绘制一个包含颜色块与对应速度标签的子图,作为独立图例使用。
内容的提问来源于stack exchange,提问作者Andrea Mastrangelo
相关产品推荐
相关产品推荐

