如何使用Plotly Express在同一图表为每个ID添加独立轨迹?
用Plotly Express绘制多ID轨迹图表解决方案
问题分析
你当前的代码仅提取了第一个ID的单个数据点绘制柱状图,无法展示完整轨迹,更无法添加其他ID的数据。核心原因是你的DataFrame是嵌套结构(每个ID对应日期、数值的列表),而Plotly Express需要长格式的扁平数据(每行对应一个数据点,包含ID、日期、数值)。
解决步骤
1. 扁平化数据
将嵌套的字典数据转换为扁平的DataFrame,每个数据点单独成一行,同时保留对应的ID。
2. 处理空值
过滤掉数据中的None值,避免绘图错误。
3. 绘制多轨迹图表
使用Plotly Express的line(或bar)函数,通过color='id'参数自动为每个ID生成独立轨迹。
完整代码示例
import pandas as pd import plotly.express as px from datetime import datetime # 原始字典数据 data = [{'id': '37f883e7e4b47b9a463bd00a', 'time_mins': [34.2, 24.6, 24.7, 19.9, 23.8, 18.9, None], 'value': [-19.35, 10.21, 9.9, 24.68, 12.67, 27.76, None], 'date': [datetime(2017, 8, 14, 6, 32, 1, 851000), datetime(2017, 8, 21, 5, 54, 11, 711000), datetime(2017, 8, 25, 11, 50, 22, 201000), datetime(2017, 8, 28, 5, 35, 9, 886000), datetime(2017, 9, 1, 11, 40, 22, 159000), datetime(2017, 9, 11, 6, 25, 16, 110000), None]}, {'id': '37eba6db0eed3488860b07ed', 'time_mins': [23.7, 21.0, 23.0, 19.7, 21.0, 21.1, 20.1, 20.0], 'value': [12.98, 21.29, 15.13, 25.29, 21.29, 20.98, 24.06, 24.37], 'date': [datetime(2017, 8, 4, 12, 21, 1, 422000), datetime(2017, 8, 11, 12, 0, 57, 744000), datetime(2017, 8, 18, 11, 54, 11, 655000), datetime(2017, 8, 20, 2, 12, 4, 759000), datetime(2017, 8, 27, 2, 4, 24, 745000), datetime(2017, 8, 28, 6, 10, 17, 230000), datetime(2017, 9, 8, 12, 1, 8, 540000), datetime(2017, 9, 15, 11, 30, 57, 29000)]}, {'id': '37f0eccc09f3193bb0d63725', 'time_mins': [16.8, 17.4, 17.6, 17.4, 16.4], 'value': [34.22, 32.38, 31.76, 32.38, 35.45], 'date': [datetime(2017, 8, 8, 12, 14, 48, 844000), datetime(2017, 8, 15, 11, 37, 18, 1000), datetime(2017, 8, 22, 11, 43, 55, 218000), datetime(2017, 8, 29, 11, 40, 29, 524000), datetime(2017, 9, 5, 11, 50, 23, 651000)]}, {'id': '6303630c067719cf5bb7c98e', 'time_mins': [21.2, None, 23.0], 'value': [20.68, None, 15.13], 'date': [datetime(2017, 8, 22, 12, 9, 44, 371000), None, datetime(2017, 9, 12, 11, 47, 10, 55000)]}, {'id': '37e905f5ba0a4ac5b6b26ee0', 'time_mins': [19.0, 18.1, 17.8, 14.5, 13.8], 'value': [27.45, 30.22, 31.14, 41.3, 43.46], 'date': [datetime(2017, 8, 2, 11, 45, 5, 908000), datetime(2017, 8, 4, 11, 30, 25, 236000), datetime(2017, 8, 8, 11, 36, 59, 697000), datetime(2017, 8, 11, 11, 30, 28, 737000), datetime(2017, 8, 13, 1, 22, 59, 471000)]}] # 扁平化数据 flat_data = [] for item in data: id_val = item['id'] # 遍历每个日期和数值的对应对 for date, val in zip(item['date'], item['value']): if date is not None and val is not None: flat_data.append({'id': id_val, 'date': date, 'value': val}) # 转换为DataFrame df = pd.DataFrame(flat_data) # 绘制多轨迹折线图(如需柱状图,替换为px.bar即可) fig = px.line(df, x='date', y='value', color='id', title='各ID数值随日期变化轨迹', labels={'date': '日期', 'value': '数值', 'id': 'ID'}) fig.show()
代码说明
- 扁平化处理:遍历每个ID的日期和数值列表,将有效数据点拆分为单独行,确保Plotly能识别每个ID的完整数据序列。
- 空值过滤:跳过
date或value为None的条目,避免绘图异常。 - 多轨迹生成:
color='id'参数自动为每个ID分配不同颜色并生成图例,实现同一图表内的多条独立轨迹。
内容的提问来源于stack exchange,提问作者user20061693
相关产品推荐
相关产品推荐

