如何从Python中动态更新的matplotlib条形图提取数据为DataFrame?
实现方法
方法1:维护同步的数据源(推荐)
直接在更新图表时同步维护一个DataFrame,后续提取数据直接复用这个数据源,避免从图表元素反向提取,既稳定又高效。
示例代码:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import time # 初始化数据源 data = pd.DataFrame({'category': ['A', 'B', 'C'], 'value': [10, 20, 15]}) fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4)) # 绘制初始水平条形图 bar_container = sns.barplot(data=data, x='value', y='category', ax=ax1, orient='h').containers[0] def update_chart_and_data(new_values): # 更新数据源 data['value'] = new_values # 更新图表条形宽度 for bar, val in zip(bar_container, new_values): bar.set_width(val) # 重绘图表 plt.draw() # 模拟实时更新+间歇性提取数据生成第二个图 for i in range(5): # 生成新数据 new_vals = [10+i*2, 20-i*3, 15+i*1] # 更新第一个图和数据源 update_chart_and_data(new_vals) plt.pause(1) # 间歇性提取(每2次更新执行一次) if i % 2 == 0: # 直接用维护的DataFrame生成第二个图 ax2.clear() sns.barplot(data=data, x='value', y='category', ax=ax2, orient='h') ax2.set_title(f'Extracted Data at Iteration {i}') plt.draw() plt.show()
方法2:从图表容器中提取数据
如果无法维护同步数据源,可从图表的patches中提取当前显示的宽度(使用公开方法get_width(),不要依赖私有属性_width),同时获取分类标签,组装成DataFrame。
示例代码:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import time fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4)) # 初始绘图 bar_container = sns.barplot(x=[10,20,15], y=['A','B','C'], ax=ax1, orient='h').containers[0] def extract_chart_data(ax): # 获取分类标签 categories = [tick.get_text() for tick in ax.get_yticklabels()] # 获取每个条形的当前宽度(调用公开API) values = [patch.get_width() for patch in ax.containers[0]] # 组装成DataFrame return pd.DataFrame({'category': categories, 'value': values}) # 模拟实时更新+间歇性提取 for i in range(5): new_vals = [10+i*2, 20-i*3, 15+i*1] # 更新条形宽度 for bar, val in zip(bar_container, new_vals): bar.set_width(val) plt.draw() plt.pause(1) if i % 2 == 0: # 从第一个图提取数据 extracted_df = extract_chart_data(ax1) # 生成第二个图 ax2.clear() sns.barplot(data=extracted_df, x='value', y='category', ax=ax2, orient='h') ax2.set_title(f'Extracted Data at Iteration {i}') plt.draw() plt.show()
关键提示
- 避免直接访问
_width这类私有属性:matplotlib的私有属性可能在版本更新中变更,使用公开的get_width()方法兼容性更强。 - 优先选择同步数据源方案:这种方式代码逻辑更清晰,减少了从图表反向提取数据的潜在风险,尤其适合实时更新场景。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

