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

Plotly绘制Python可迭代类多折线图遇JSON序列化错误

解决Plotly px.line中多个自定义可迭代类实例的JSON序列化错误

问题根源

当传入单个example_class实例时,Plotly会直接迭代它提取数据;但传入多个实例组成的列表时,Plotly内部会尝试对列表中的对象进行JSON序列化(用于图表的存储或交互逻辑),而自定义类默认没有实现JSON序列化逻辑,因此抛出TypeError。

解决方案

1. 提前将实例转换为列表/数组

最简单的处理方式是把每个example_class实例转换成普通列表,再传入px.line:

import plotly.express as px

# 假设有多个自定义类实例
instance_list = [example_class(data1), example_class(data2)]
# 转换为列表的列表
y_data = [list(instance) for instance in instance_list]

fig = px.line(y=y_data)
fig.show()

Plotly处理普通列表时不会触发序列化问题,完全适配现有逻辑。

2. 为自定义类添加JSON序列化方法

如果不想每次手动转换,可以给example_class实现__json__方法,让Plotly能自动序列化实例:

class example_class:
    def __init__(self, data):
        self.data = data
        self._iter_idx = 0

    # 已实现的迭代器方法
    def __iter__(self):
        self._iter_idx = 0
        return self

    def __next__(self):
        if self._iter_idx >= len(self.data):
            raise StopIteration
        val = self.data[self._iter_idx]
        self._iter_idx += 1
        return val

    def __len__(self):
        return len(self.data)

    # 添加JSON序列化方法
    def __json__(self):
        return list(self)

Plotly在序列化时会优先调用对象的__json__方法,自动把实例转为可序列化的列表。

3. 用Graph Objects手动构建轨迹

如果需要更精细的控制,直接使用Plotly Graph Objects逐个添加轨迹,绕开自动序列化逻辑:

import plotly.graph_objects as go

instance_list = [example_class(data1), example_class(data2)]
fig = go.Figure()

for i, instance in enumerate(instance_list):
    fig.add_trace(go.Scatter(
        y=list(instance),
        name=f"系列 {i+1}"
    ))

fig.show()

这种方式直接传入迭代后的原始数据,完全避免对象序列化问题。

内容的提问来源于stack exchange,提问作者José Fuentes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 03:43:15