gpt4 book ai didi

matplotlib 中的动画与分散和使用 set_offsets : Autoscale of figure is not working

转载 作者:行者123 更新时间:2023-12-03 15:29:46 24 4
gpt4 key购买 nike

我正在使用动画在 python GUI 中使用 matplotlib 绘图。下面是代码

import sys
from PyQt4 import QtGui

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar
import matplotlib.pyplot as plt
import matplotlib.animation
import numpy as np
class Window(QtGui.QDialog):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
self.figure = plt.figure()
self.canvas = FigureCanvas(self.figure)
self.toolbar = NavigationToolbar(self.canvas, self)
layout = QtGui.QVBoxLayout()
layout.addWidget(self.toolbar)
layout.addWidget(self.canvas)
self.setLayout(layout)
self.ax=self.figure.add_subplot(111)

plt.autoscale(enable=True, axis='both', tight=None #for auto scaling

self.data = [500, -500, 501, -502,.... 623] #some list of data
self.ax = plt.gca()
self.ax.grid()
self.sc = self.ax.scatter(self.data[::2], self.data[1::2]

def plot(self, a):
for i in range(len(self.data)):
self.data[i] = int(self.data[i])+5
self.sc.set_offsets(np.c_[self.data[::2], self.data[1::2]])
self.canvas.draw()

if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)

main = Window()
ani = matplotlib.animation.FuncAnimation(main.figure, main.plot,
frames=4, interval=100, repeat=True)
main.show()

sys.exit(app.exec_())

我正在使用动画调用的绘图函数内的 set_offsets 更新绘图。当绘图值不断增加并完成绘图时,绘图就会消失。所以我使用了自动缩放()。但它不起作用。静止轴保持固定,绘图消失。
请帮我做图中的自动缩放。提前致谢。

最佳答案

问题是在轴自动缩放时不考虑散射偏移。这可能是一个错误,或者是一个想要的功能;无论如何,两种解决方法是:

使用 plot
在许多情况下可以接受的一种解决方法是使用线图 plt.plot而不是 plt.scatter .在这种情况下,轴可以使用 ax.relim 自动缩放其次是 ax.autoscale_view() .

import matplotlib.pyplot as plt
import matplotlib.animation
import numpy as np

fig, ax = plt.subplots()
ax.grid()

data = np.cumsum(np.random.normal(size=100)) #some list of data
sc, = ax.plot(data[::2], data[1::2], marker="o", ls="") # set linestyle to none

def plot(a, data):
data += np.cumsum(np.random.normal(size=100)+3e-2)
sc.set_data(data[::2], data[1::2])
ax.relim()
ax.autoscale_view(True,True,True)

ani = matplotlib.animation.FuncAnimation(fig, plot, fargs=(data,),
frames=4, interval=100, repeat=True)
plt.show()

使用 scatter并以编程方式设置限制

如果以上不能使用(例如,因为散点应该具有不同的大小或颜色),则需要根据数据更新限制。
import matplotlib.pyplot as plt
import matplotlib.animation
import numpy as np

fig, ax = plt.subplots()

data = np.cumsum(np.random.normal(size=100)) #some list of data

ax.grid()
sc = ax.scatter(data[::2], data[1::2], c=data[1::2])

def plot(a, data):
data += np.cumsum(np.random.normal(size=100)+3e-2)
X = np.c_[data[::2], data[1::2]]
sc.set_offsets(X)
# manually relim:
xmin=X[:,0].min(); xmax=X[:,0].max()
ymin=X[:,1].min(); ymax=X[:,1].max()
ax.set_xlim(xmin-0.1*(xmax-xmin),xmax+0.1*(xmax-xmin))
ax.set_ylim(ymin-0.1*(ymax-ymin),ymax+0.1*(ymax-ymin))

ani = matplotlib.animation.FuncAnimation(fig, plot, fargs=(data,),
frames=4, interval=100, repeat=True)
plt.show()

enter image description here

关于matplotlib 中的动画与分散和使用 set_offsets : Autoscale of figure is not working,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43674917/

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