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
相关产品推荐
相关产品推荐

