基于DataFrame按sourceId绘制带svDataSvId标签的XY子图问询
问题与解决方案
需求描述
我有一个DataFrame,需要绘制以iTOW为X轴、ionoCorr为Y轴的XY图,要求:
- 每个
iTOW对应的svDataSvId作为标签显示在数据点旁 - 每个唯一的
svDataSvId对应不同的线条/标记颜色 - 分别创建
sourceId=1和sourceId=2的两个子图,方便对比
我尝试了以下代码,但不知道如何给每个iTOW标注对应的svDataSvId:
list_id=[9,10,4,36,2,30,34,11,10] for i, (source_id, list,color) in enumerate([(1,list_id, "green"), (2,list_id, "red")]): mask = (final_df1["sourceId"] == source_id) & (final_df1["svDataSvId"] == list) fig, ax = plt.subplots() ax.plot(final_df1[mask]['iTOW'], final_df1[mask]['ionoCorr'], color=color, label=f"Source {source_id}") ax.set_ylabel("Correction") ax.set_xlabel("Itows")
解决方法
核心修改点
- 改用并排子图布局,同时展示两个sourceId的结果
- 为每个唯一
svDataSvId分配独立颜色,避免同色混淆 - 遍历数据点,用
ax.text()添加svDataSvId标签
完整代码
import matplotlib.pyplot as plt import pandas as pd import numpy as np # 目标SV ID列表 list_id = [9,10,4,36,2,30,34,11,10] # 为每个唯一SV ID分配专属颜色 unique_sv_ids = np.unique(list_id) color_palette = plt.cm.tab10(np.linspace(0, 1, len(unique_sv_ids))) sv_color_map = dict(zip(unique_sv_ids, color_palette)) # 创建1行2列的子图布局 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5)) source_axes = {1: ax1, 2: ax2} # 分别处理两个sourceId for source_id in [1, 2]: current_ax = source_axes[source_id] # 筛选符合条件的数据 filter_mask = (final_df1["sourceId"] == source_id) & (final_df1["svDataSvId"].isin(list_id)) filtered_data = final_df1[filter_mask] # 按SV ID分组绘图 for sv_id, group_data in filtered_data.groupby("svDataSvId"): # 绘制带标记的线条 current_ax.plot(group_data['iTOW'], group_data['ionoCorr'], color=sv_color_map[sv_id], marker='o', linestyle='-', label=f"SV {sv_id}") # 为每个数据点添加SV ID标签 for x_val, y_val, sv_label in zip(group_data['iTOW'], group_data['ionoCorr'], group_data['svDataSvId']): current_ax.text(x_val, y_val, str(sv_label), fontsize=8, ha='right', va='bottom', bbox=dict(facecolor='white', alpha=0.7, pad=1)) # 设置子图样式 current_ax.set_title(f"Source ID = {source_id}") current_ax.set_ylabel("ionoCorr") current_ax.set_xlabel("iTOW") current_ax.legend(loc='upper right') current_ax.grid(alpha=0.3) # 调整子图间距 plt.tight_layout() plt.show()
代码说明
- 颜色映射:使用
tab10颜色映射生成区分度高的颜色,确保每个svDataSvId有唯一颜色 - 子图管理:用字典关联sourceId和对应的子图,代码更简洁
- 标签添加:通过
ax.text()在每个数据点旁标注svDataSvId,添加半透明背景框避免标签被线条遮挡 - 分组绘图:按
svDataSvId分组绘制线条,保证同一SV的所有数据点颜色一致
内容的提问来源于stack exchange,提问作者Kapil
相关产品推荐
相关产品推荐

