如何自动调整数据量使折线图平滑并维持约100个数据点?
解决方案:维持折线图数据点在约100个
你可以通过两种核心方式解决这个问题,根据需求选择即可:
1. 只保留最新100个数据点(简单直接)
如果只需要展示近期实时趋势,直接截断数据、保留最新100个点是最高效的方式。需要在类中维护一个全局数据集,每次新增数据后截取末尾100个:
修改代码如下:
class MultiColoredLineChartClass: """ Multi-Colored Line Chart Class """ def __init__(self): self.data = [] # 维护全局数据集 def render_chart(self, parent): self.figure = plt.figure(figsize=(5, 4), dpi=60) self.ax = self.figure.add_subplot(111) self.canvas = FigureCanvas(parent, -1, self.figure) return self.canvas def update_chart(self, new_data=[]): # 将新数据追加到全局数据集 self.data.extend(new_data) # 仅保留最新的100个点 display_data = self.data[-100:] if len(self.data) > 100 else self.data self.ax.clear() self.ax.plot(display_data) self.ax.set_xlabel('Time') self.ax.set_ylabel('PNL') self.ax.set_title('Live PNL Chart') self.canvas.draw()
2. 数据降采样(保留历史趋势)
如果需要展示更长周期的历史趋势,同时避免图表杂乱,可以通过降采样合并数据点——把过多的原始数据分组,每组用统计值(平均值、最大值/最小值等)替代,最终将总点数控制在100左右。这里用numpy实现分组聚合:
import numpy as np class MultiColoredLineChartClass: """ Multi-Colored Line Chart Class """ def __init__(self): self.data = [] # 维护全局数据集 self.target_points = 100 # 目标展示数据点数 def render_chart(self, parent): self.figure = plt.figure(figsize=(5, 4), dpi=60) self.ax = self.figure.add_subplot(111) self.canvas = FigureCanvas(parent, -1, self.figure) return self.canvas def downsample_data(self): if len(self.data) <= self.target_points: return self.data # 计算分组数量与每组大小 num_groups = self.target_points # 按目标点数拆分数据组 groups = np.array_split(self.data, num_groups) # 对每组取平均值(可替换为np.max、np.min等聚合方式) downsampled = [np.mean(group) for group in groups] return downsampled def update_chart(self, new_data=[]): self.data.extend(new_data) display_data = self.downsample_data() self.ax.clear() self.ax.plot(display_data) self.ax.set_xlabel('Time') self.ax.set_ylabel('PNL') self.ax.set_title('Live PNL Chart') self.canvas.draw()
选择建议
- 若只关注短期实时波动,选第一种方法,简单高效。
- 若需要兼顾长期趋势展示,选第二种方法,通过聚合保留数据核心特征。
内容的提问来源于stack exchange,提问作者Shivdas B
相关产品推荐
相关产品推荐

