【问题标题】:Python - Replace i value instead of appendingPython - 替换 i 值而不是附加
【发布时间】:2021-08-23 03:11:14
【问题描述】:

我正在尝试绘制实时数据。我设法绘制了数据,但我希望条形图在单个 x 值上上下移动,而不是为每个新数据点生成新的 x 值。我相信我必须用类似替换的东西替换函数 x.append(i),有什么想法吗?谢谢!!

到目前为止,这是我想出的:

import time
import psutil
import matplotlib.pyplot as plt
%matplotlib notebook

fig = plt.figure()
ax = fig.add_subplot(111)
fig.show()
plt.axis('off')

i = 0
x, y = [], []

while True:
    x.append(i)
    y.append(psutil.cpu_percent())
    
    ax.bar(x, y, color='b')
    
    fig.canvas.draw()
    
    ax.set_xlim(left=max(0, i-50), right=i+50)
    
    time.sleep(0.1)
    i += 1

【问题讨论】:

    标签: python matplotlib append


    【解决方案1】:

    对于条形图,您可以在 while 循环内创建一个列表,并在其中立即更新它。首先你需要导入一个随机数来获取y轴的随机值,或者你可以使用cpu_percent

    import psutil 
    import random
    

    这两个应该工作。 然后:

    while True: 
        x_axis = [str(_) for _ in range(100, 200)]
        y_axis = [8 * random.random() for _ in range(100, 200)]
        ax.bar(x, y, color='b')
        fig.canvas.draw()
        time.sleep(0.1)
    

    但是,matplotlib 不方便绘制真实数据,我强烈建议您使用bokeh。您可以找到散景文档here。创建任何类型的实时情节真的很酷。同时,您可以将其与您的网络浏览器集成。希望对你有帮助)

    【讨论】:

    • 谢谢!非常有用的资源(:
    • 不幸的是,我收到以下错误: ---------------------------------- ----------------------------------------- NameError Traceback(最近一次调用最后一次)/ tmp/ipykernel_526/3961775249.py in 9 x_axis = [str(_) for _ in range(100, 200)] 10 y_axis = [8 * random.random() for _ in range(100, 200)] ---> 11 ax.bar(x, y, color='b') 12 fig.canvas.draw() 13 time.sleep(0.1) NameError: name 'x' is not defined
    • 您是否尝试过我的第二个选项,应该可以。 Bokeh 非常适合流式传输数据。
    【解决方案2】:

    如果你只想显示最新的值,你可以考虑这样做:

    plt.ion()
    graph = plt.bar(["Now"], [0])[0]
    plt.axis('off')
    
    i = 0
    data = {}
    
    while True:
    
        cpu_percent = psutil.cpu_percent()
        
        graph.set_ydata(cpu_percent)
        plt.draw()
        plt.pause(0.1)
    
        data[i] = cpu_percent 
        i += 1
    

    这样,您仍然拥有所有数据点的记录,以便稍后使用 (x, y),但您一次只能在图表上显示 1 个 x 值。

    Further reading

    【讨论】:

    • 谢谢!我确实收到以下错误: AttributeError Traceback (last recent call last) /tmp/ipykernel_184/3640181601.py in 10 cpu_percent = psutil.cpu_percent() 11 ---> 12 graph.set_ydata(cpu_percent) 13 plt .draw() 14 plt.pause(0.1) AttributeError: 'Rectangle' object has no attribute 'set_ydata'
    • 你能用graph.set_height(cpu_percent)代替graph.set_ydata(cpu_percent)吗?
    猜你喜欢
    • 1970-01-01
    • 2017-04-20
    • 2016-11-12
    • 2018-07-17
    • 2014-07-29
    • 1970-01-01
    • 2016-05-29
    • 2019-09-17
    • 1970-01-01
    相关资源
    最近更新 更多