【问题标题】:Matplotlib not changing the x scale for continuous displaying dataMatplotlib 不改变 x 比例以连续显示数据
【发布时间】:2018-08-17 13:28:31
【问题描述】:

我尝试过类似以下的方法:

import matplotlib.pyplot as plt
import numpy as np
d= [1,2,3,4]
f = [1,2,3,4,5]
plt.ion()
fig = plt.figure()
fig.set_size_inches(10,5)
ax1 = fig.add_subplot(111)
line1, = ax1.plot(np.arange(len(d)),d,color='blue', label='first',marker=".")
line2, = ax1.plot(np.arange(len(f)),f,color='red', label='second',marker=".")
plt.show()

for i in range(20):
    d.append(i)
    f.append(i)
    line1.set_xdata(np.arange(len(d)))
    line2.set_xdata(np.arange(len(f)))
    line1.set_ydata(d)
    line2.set_ydata(f)

得到类似这样的错误:

>>> Exception in Tkinter callback
Traceback (most recent call last):ges\numpy\lib\stride_tricks.py", line 249, in broadcast_arrays
  File "C:\Python35\lib\site-packages\matplotlib\backends\tkagg.py", line 26, in blit
    dataptr, colormode, bboxptr)kages\numpy\lib\stride_tricks.py", line 184, in _broadcast_shape
_tkinter.TclError: this isn't a Tk application
ValueError: shape mismatch: objects cannot be broadcast to a single shape
During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Python35\lib\tkinter\__init__.py", line 1549, in __call__
    return self.func(*args)
  File "C:\Python35\lib\tkinter\__init__.py", line 596, in callit
    func(*args)
  File "C:\Python35\lib\site-packages\matplotlib\backends\_backend_tk.py", line 310, in idle_draw
    self.draw()
  File "C:\Python35\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 13, in draw
    tkagg.blit(self._tkphoto, self.renderer._renderer, colormode=2)
  File "C:\Python35\lib\site-packages\matplotlib\backends\tkagg.py", line 34, in blit
    dataptr, colormode, bboxptr)
_tkinter.TclError: this isn't a Tk application

即使它没有改变 x 轴值。

我想像实时显示一样在同一个图表中显示这两个值。

数组有不同的大小。应用被称为重复的问题的解决方案后出现错误:

ValueError:形状不匹配:无法将对象广播到单个形状

我的查询与不同的数组大小和实时绘图有关。

【问题讨论】:

  • @DavidG 在将问题设为重复之前,您是否尝试过我的示例并发现问题相似?我尝试了您指定为重复或类似链接的解决方案,但对我没有用。
  • @DavidG 在我尝试实施时出现错误。 ValueError: shape mismatch: objects cannot be broadcast to a single shape 如您所见,您所说的问题是重复的,没有数组长度不同的问题。请检查一次。
  • @DavidG 你有什么答案吗,请告诉我。您已将我标记为重复,所以请告诉我您发现了什么相似之处以及适合我的答案。

标签: python python-3.x matplotlib


【解决方案1】:

我怀疑错误来自 for 循环太快,但我无法重现它。因此,让我们正确处理动画。通常你会想要设置一个延迟来感知情节的变化。为此使用plt.pause()

要将绘图重新调整为新添加的数据,请使用.relim().autoscale_view()

最后,您可能希望在循环终止时保持绘图打开;这可以通过关闭交互模式并再次调用show 来完成。

import matplotlib
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt
import numpy as np
d= [1,2,3,4]
f = [1,2,3,4,5]
plt.ion()
fig = plt.figure()
fig.set_size_inches(10,5)
ax1 = fig.add_subplot(111)
line1, = ax1.plot(np.arange(len(d)),d,color='blue', label='first',marker=".")
line2, = ax1.plot(np.arange(len(f)),f,color='red', label='second',marker=".")
plt.show()

for i in range(20):
    d.append(i)
    f.append(i)
    line1.set_xdata(np.arange(len(d)))
    line2.set_xdata(np.arange(len(f)))
    line1.set_ydata(d)
    line2.set_ydata(f)
    ax1.relim()
    ax1.autoscale_view()
    plt.pause(0.5)

# To keep the plot open after the animation has finished.  
plt.ioff()
plt.show()

【讨论】:

  • 感谢您对我的帮助。至少你已经明白这个问题是不同的,因此得到了回答。先生非常感谢您。寻求帮助。
  • 您是否仍然使用此答案中的代码收到错误?如果是这样,您能否详细说明一下如何运行代码?
猜你喜欢
  • 2021-02-13
  • 1970-01-01
  • 2012-07-19
  • 2017-09-03
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
  • 2020-09-26
  • 2021-06-29
相关资源
最近更新 更多