如何为全量时序数据堆叠柱状图添加横向滚动条?
实现带横向滚动条的全量堆叠柱状图
针对大数据量时间序列堆叠柱状图拥挤的问题,你可以通过结合Matplotlib和Tkinter实现带横向滚动条的可视化方案,以下是完整代码:
import pandas as pd import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk import tkinter as tk from tkinter import ttk # 1. 处理数据(保留原有逻辑,使用全量数据) node_df = df.resample('H', on='START_TIMESTAMP').NODES_USED.sum() node_df = pd.DataFrame(node_df, columns=['NODES_USED']) node_df['UNUSED_NODES'] = 49152 - node_df['NODES_USED'] total_bars = len(node_df) # 可自定义初始显示的柱状条数量 display_count = 20 # 2. 创建Tkinter窗口 root = tk.Tk() root.title("Node Usage Stacked Bar Chart") # 3. 创建Matplotlib图形和轴 fig, ax = plt.subplots(figsize=(15, 12)) node_df.plot.bar(stacked=True, ax=ax) ax.set_xlabel('Time') ax.set_ylabel('Nodes') ax.legend(loc='upper right') # 设置初始x轴显示范围 ax.set_xlim(0, display_count) # 4. 将Matplotlib画布嵌入Tkinter canvas = FigureCanvasTkAgg(fig, master=root) canvas.draw() canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1) # 添加Matplotlib工具栏 toolbar = NavigationToolbar2Tk(canvas, root) toolbar.update() canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1) # 5. 创建横向滚动条并绑定交互逻辑 scrollbar = ttk.Scrollbar(root, orient=tk.HORIZONTAL) scrollbar.pack(side=tk.BOTTOM, fill=tk.X) def scroll_x(*args): # 根据滚动条位置计算显示起始索引 start_idx = int(scrollbar.get()[0] * (total_bars - display_count)) ax.set_xlim(start_idx, start_idx + display_count) fig.canvas.draw_idle() scrollbar.config(command=scroll_x) scrollbar.config(from_=0, to=total_bars - display_count) # 启动Tkinter主循环 tk.mainloop()
关键说明:
- 基于Tkinter实现滚动条与Matplotlib画布的联动,交互逻辑直观
- 可通过修改
display_count调整单次显示的柱状条数量 - 滚动拖动时,通过修改
ax.set_xlim()动态切换显示的时间区间 - 完全保留原有堆叠柱状图的样式,同时支持全量数据的滚动查看
内容的提问来源于stack exchange,提问作者maks
相关产品推荐
相关产品推荐

