gpt4 book ai didi

python - Matplotlib 图形中的进度线

转载 作者:太空狗 更新时间:2023-10-30 00:07:59 26 4
gpt4 key购买 nike

目标:绘制图形 (x,y) 并在图形上移动垂直线 w.r.t 到计时器。

我开始使用 matplotlib 实现它。可以使用 matplotlib 的 draw() 功能来实现这一点,但它会消耗 cpu,因为它每次都重绘并且不允许我与图形交互。所以我决定使用 matplotlib 的动画功能。在未来我也想暂停移动线。所以我不能使用 matplotlib.animation.FuncAnimatin

问题:我使用 canvas.copy_from_bbox(ax.bbox)、ax.draw_artist(line)、canvas.blit(ax.bbox)。但是,我无法将图形存储在后台并在其上移动一条线。当我尝试存储时,它以一种非常奇怪的方式覆盖。

这是我构建的代码。任何人都可以帮助我吗?提前致谢。

import sys
import matplotlib.pyplot as p
import time
fig=p.figure();
ax = fig.add_subplot(1,1,1)

y=[];x=[];y1=[0,1000];x1=[0,0]
y=numpy.random.randn(1000,1)*100
x=numpy.arange(0,1000)
line1, = ax.plot(x,y,color='black');
ax.set_ylim(0, 1000);
line, = ax.plot(x1,y1,color='r',alpha=1,animated=True); # this is the line which i wanted to move over the graph w.r.t to time. ( i can also use axvline , but i guess its the same).
canvas = ax.figure.canvas
canvas.draw()
background = canvas.copy_from_bbox(ax.bbox); #my problem is here
starttime=time.time();
mytimer=0;
mytimer_ref=0;
def update(canvas,line,ax):
canvas.restore_region(background) #my problem is here
t=time.time()-starttime;
mytimer=t+mytimer_ref;
x1=[mytimer,mytimer];
line.set_xdata(x1);
ax.draw_artist(line)
canvas.blit(ax.bbox) #my problem is here

def onclick(event):
global starttime
starttime=time.time();
global mytimer_ref;
mytimer_ref=event.xdata;
print "starttime",starttime;


cid=line1.figure.canvas.mpl_connect('button_press_event',onclick); # when i click the mouse over a point, line goes to that point and start moving from there.
timer=fig.canvas.new_timer(interval=100);
args=[canvas,line,ax];
timer.add_callback(update,*args); # every 100ms it calls update function
timer.start();
p.show();

最佳答案

所以看起来您所指的“非常奇怪的方式”本质上是错误的 bbox 已被您的 background = canvas.copy_from_bbox(ax.bbox) 捕获。我相信这是大多数后端的一个已知问题,其中添加工具栏等会影响 bbox 的位置以进行 blitting。

本质上,如果您可以在窗口弹出之后捕获背景,那么一切都应该为您工作。这可以通过多种方式完成,在您的情况下,最简单的方法是将 canvas.draw() 命令替换为 plt.show(block=False) ,这将调出窗口,但不会使其成为阻塞命令。

作为一个小小的补充,我相信你知道分号在 python 代码中不是必需的,但在调试时,我稍微整理了你的代码(没有完全结束):

import sys
import matplotlib.pyplot as plt
import time
import numpy


fig = plt.figure()
ax = fig.add_subplot(111)


max_height = 100
n_pts = 100
y1 = [0, max_height]
x1 = [0, 0]
y = numpy.random.randn(n_pts) * max_height
x = numpy.arange(0, n_pts)

# draw the data
line1, = ax.plot(x, y, color='black')

# fix the limits of the plot
ax.set_ylim(0, max_height)
ax.set_xlim(0, n_pts)

# draw the plot so that we can capture the background and then use blitting
plt.show(block=False)

# get the canvas object
canvas = ax.figure.canvas
background = canvas.copy_from_bbox(ax.bbox)

# add the progress line.
# XXX consider using axvline
line, = ax.plot(x1, y1, color='r', animated=True)


starttime=time.time()
mytimer=0
mytimer_ref=0

def update(canvas, line, ax):
# revert the canvas to the state before any progress line was drawn
canvas.restore_region(background)

# compute the distance that the progress line has made (based on running time)
t = time.time() - starttime
mytimer = t + mytimer_ref
x1 = [mytimer,mytimer]
# update the progress line with its new position
line.set_xdata(x1)
# draw the line, and blit the axes
ax.draw_artist(line)
canvas.blit(ax.bbox)

def onclick(event):
global starttime
starttime=time.time()
global mytimer_ref
mytimer_ref=event.xdata
print "starttime",starttime


cid=line1.figure.canvas.mpl_connect('button_press_event',onclick) # when i click the mouse over a point, line goes to that point and start moving from there.
timer=fig.canvas.new_timer(interval=100)
args=[canvas,line,ax]
timer.add_callback(update,*args) # every 100ms it calls update function
timer.start()
plt.show()

HTH

关于python - Matplotlib 图形中的进度线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11942936/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com