You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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()

代码说明

  1. 颜色映射:使用tab10颜色映射生成区分度高的颜色,确保每个svDataSvId有唯一颜色
  2. 子图管理:用字典关联sourceId和对应的子图,代码更简洁
  3. 标签添加:通过ax.text()在每个数据点旁标注svDataSvId,添加半透明背景框避免标签被线条遮挡
  4. 分组绘图:按svDataSvId分组绘制线条,保证同一SV的所有数据点颜色一致

内容的提问来源于stack exchange,提问作者Kapil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 16:55:26