如何修改Seaborn绘图函数,实现单独绘图与多图叠加展示?
解决方案:用类封装记录历史数据,兼顾单独绘图与组合叠加图
要实现「每次调用显示单独分布图,同时保留所有数据用于最终叠加图」的需求,最优雅的方式是用类来封装功能——类可以帮我们在每次调用时自动记录传入的数据,既不影响单独绘图的即时展示,也能在需要时统一生成叠加组合图。
完整代码实现
import seaborn as sns import matplotlib.pyplot as plt class DistributionPlotter: def __init__(self): # 初始化私有列表,保存所有传入的历史数据及对应标签 self._history_data = [] def getPlot(self, data, label=None): # 将当前数据存入历史记录 self._history_data.append((data, label)) # 绘制并展示单独的分布图 plt.figure() # 新建画布,避免和后续组合图互相干扰 sns.distplot(data, hist=False, label=label) plt.title("单独数据分布图") plt.legend() plt.show() def plot_combined(self): # 生成叠加所有历史数据的组合图 plt.figure() for idx, (data, label) in enumerate(self._history_data): # 自动生成默认标签(如果用户没传) plot_label = label if label is not None else f"数据组 {idx+1}" sns.distplot(data, hist=False, label=plot_label) plt.title("所有数据叠加分布图") plt.legend() plt.show()
使用示例
# 创建绘图实例 plotter = DistributionPlotter() # 多次调用,每次都会弹出单独的分布图 plotter.getPlot(data1, label="用户行为数据") plotter.getPlot(data2, label="系统日志数据") plotter.getPlot(data3) # 自动使用默认标签 # 最后生成包含所有数据的叠加组合图 plotter.plot_combined()
关键细节说明
- 用
self._history_data私有列表记录数据,避免全局变量带来的状态混乱和命名冲突。 - 每次调用
getPlot时新建画布(plt.figure()),确保单独图和组合图的绘制完全独立,不会出现图形重叠的问题。 - 新增
label参数,方便在组合图中区分不同数据组,提升可视化的可读性。 - 如果你使用的是Seaborn v0.11及以上版本,
distplot已被标记为弃用,建议替换为sns.kdeplot(data=data, fill=False, label=plot_label)来实现相同的无直方图分布曲线效果。
内容的提问来源于stack exchange,提问作者a_parida
相关产品推荐
相关产品推荐

