python - 在matplotlib中动态更新多轴

标签 python matplotlib

我想使用 matplotlib 动画在 PyQT GUI 上显示传感器数据。 我已经有一个工作图,每当我使用以下代码从外部源接收到新的传感器值时,它都会得到更新:

    def __init__(self):
            self.fig = Figure(figsize=(width, height), dpi=dpi)
            self.axes = self.fig.add_subplot(111)
            self.axes.grid()
            self.xdata = []
            self.ydata = []
            self.entry_limit = 50
            self.line, = self.axes.plot([0], [0], 'r')

    def update_figure_with_new_value(self, xval: float, yval: float):
            self.xdata.append(xval)
            self.ydata.append(yval)

            if len(self.xdata) > self.entry_limit:
                self.xdata.pop(0)
                self.ydata.pop(0)

            self.line.set_data(self.xdata, self.ydata)
            self.axes.relim()
            self.axes.autoscale_view()
            self.fig.canvas.draw()
            self.fig.canvas.flush_events()

我现在想扩展绘图以显示具有相同 x 轴的另一个数据系列。我试图通过对上面的初始化代码添加以下内容来实现这一点:

            self.axes2 = self.axes.twinx()
            self.y2data = []
            self.line2, = self.axes2.plot([0], [0], 'b')

并且在 update_figure_with_new_value() 函数中(出于测试目的,我只是尝试将 1 加到 yval,稍后我将扩展该函数的参数):

            self.y2data.append(yval+1)
            if len(self.y2data) > self.entry_limit:
                self.y2data.pop(0)
            self.line2.set_data(self.xdata, self.ydata)
            self.axes2.relim()
            self.axes2.autoscale_view()

但是我没有在绘图中得到两条线,它们应该具有完全相同的移动但只是移动了一条,我得到了第二个绘图轴(蓝色)的垂直线。第一个轴(红色)保持不变,没问题。

second axis of plot (blue) is wrong

如何使用 matplotlib 更新多轴以便它们显示正确的值?

我正在使用 python 3.4.0 和 matplotlib 2.0.0。

最佳答案

由于没有可用的最小示例,因此很难说出这种不良行为的原因。原则上 ax.relim()ax.autoscale_view() 应该做你需要的。

所以这是一个完整的示例,它在使用 python 2.7、matplotlib 2.0 和 PyQt4 运行时可以正常工作并更新两个比例:

import numpy as np
import matplotlib.pyplot as plt
from PyQt4 import QtGui, QtCore
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar

class Window(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.widget = QtGui.QWidget()
        self.setCentralWidget(self.widget)
        self.widget.setLayout(QtGui.QVBoxLayout())
        self.widget.layout().setContentsMargins(0,0,0,0)
        self.widget.layout().setSpacing(0)

        self.fig = Figure(figsize=(5,4), dpi=100)
        self.axes = self.fig.add_subplot(111)
        self.axes.grid()
        self.xdata = [0]
        self.ydata = [0]
        self.entry_limit = 50
        self.line, = self.axes.plot([], [], 'r', lw=3)

        self.axes2 = self.axes.twinx()
        self.y2data = [0]
        self.line2, = self.axes2.plot([], [], 'b')

        self.canvas = FigureCanvas(self.fig)
        self.canvas.draw()

        self.nav = NavigationToolbar(self.canvas, self.widget)
        self.widget.layout().addWidget(self.nav)
        self.widget.layout().addWidget(self.canvas)

        self.show()

        self.ctimer = QtCore.QTimer()
        self.ctimer.timeout.connect(self.update)
        self.ctimer.start(150)


    def update(self):
        y = np.random.rand(1)
        self.update_figure_with_new_value(self.xdata[-1]+1,y)

    def update_figure_with_new_value(self, xval,yval):
        self.xdata.append(xval)
        self.ydata.append(yval)

        if len(self.xdata) > self.entry_limit:
            self.xdata.pop(0)
            self.ydata.pop(0)
            self.y2data.pop(0)

        self.line.set_data(self.xdata, self.ydata)
        self.axes.relim()
        self.axes.autoscale_view()

        self.y2data.append(yval+np.random.rand(1)*0.17)

        self.line2.set_data(self.xdata, self.y2data)
        self.axes2.relim()
        self.axes2.autoscale_view()

        self.fig.canvas.draw()
        self.fig.canvas.flush_events()


if __name__ == "__main__":
    qapp = QtGui.QApplication([])
    a = Window()
    exit(qapp.exec_())

您可能想要测试它并报告它是否有效。

关于python - 在matplotlib中动态更新多轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43785610/

相关文章:

python - python 中的图形图上有很多边

python - 我想创建一个简单的电影推荐系统,其中 Y(i,j)=第 j 个用户评分的电影,如果电影已评分,则 R(i,j)=1,否则 r(i,j)=0

java - 哪些语言可以很好地替代 Java?

python - Matplotlibplot_surface 伪面

python - Python 中一张图中的停留图

python - 为什么 matplotlib 不能在 pycharm 中绘制工作?

python - 计算不规则间距点密度的有效方法

python - 以编程方式从 Yahoo! 获取联系人地址簿

python - 在 Windows 中将字符串传递给 pathlib.Path 时出现操作系统错误

python - wxPython 中的分组事件