You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 08:42:14