matplotilb:使用现有数据仅更新轴

时间:2017-06-09 06:45:32

标签: python matplotlib pyqt5

我正在使用PyQt开发桌面应用程序并使用matplotlib绘制数据(32个浮点数列表)。数据以一定的时间间隔连续来自嵌入式设备,每当有新数据到来时,都会通知应用程序并自动(通过连接)将数据绘制到画布。这可以按预期工作。

现在我想为Y轴和X轴实现单位选择。我使用无线电选择按钮,Y轴有五个选项,X轴有两个选项。当用户更改任一轴的单位选择时,应使用新的单位选择重新绘制现有数据。还有一件事是在更新时应保持缩放级别。

这是我当前的绘图功能(保持缩放级别):

def plot(self, spectrum: list):
    spectrum = self.calculate_spectrum_values(spectrum)
    self.line.set_data(self.x_dimension, spectrum)
    self.canvas.draw()

X轴的单位选择仅影响要显示的单位(像素或波长)并且它是线性的,因此它不会影响数据的形状。 Y轴的单位选择正在影响calculate_spectrum_values()方法中发生的事情,我对具有不同选择的数据进行不同的数学运算。我有另一种方法可以改变单位选择。对于X轴,它如下:

def set_xaxis(self):
    if self.unit_selection_x == "Pixels":
        self.axes.set_xlabel('pixel')
        self.x_dimension = numpy.linspace(1, 32, 32)
    elif self.unit_selection_x == "Wavelengths":
        self.axes.set_xlabel('wavelength')
        self.x_dimension = numpy.linspace(400, 700, 32)
    else:
        raise ValueError
    self.axes.set_xlim(self.x_dimension.min(), self.x_dimension.max())

当测量运行时,此当前实现正常工作,因为新数据以一秒为间隔出现,因此在此期间,新数据始终使用新单位选择进行更新。但我希望这样做,以便单位选择与数据更新无关,并且在测量未运行时也应该有效。在这种情况下,它应该在单位选择改变时重新绘制现有数据。怎么做?

其他问题是如何在更改单位选择时保持缩放级别。目前它总是进入默认状态,但我想实现这一点,以便如果用户放大/缩小,在更改单位选择后会显示相同的缩放位置。知道如何保持缩放状态并同时更新轴吗?

简而言之,我如何只更新matplotlib中的轴,而不是触摸缩放或数据,而是使用现有值?

1 个答案:

答案 0 :(得分:0)

首先,您需要介绍一种从一个单元转换为另一个单元的方法。在这种情况下,两者之间存在线性关系,这使得它非常容易。

#calculate wavelength, given pixels
p2w = lambda x: (700.-400.)/(32.-1.)*(x-1.)+400.
# calculate pixels, given wavelength
w2p = lambda x: (32.-1.)/(700.-400.)*(x-400.)+1.

然后,您可以获取当前轴限制,并应用上面的相应转换。用于从像素转换为波长,

xmin, xmax = ax.get_xlim()
ax.set_xlim(p2w(xmin), p2w(xmax))

或用于从波长转换为像素

xmin, xmax = ax.get_xlim()
ax.set_xlim(w2p(xmin), w2p(xmax))

您可以对数据执行相同操作

xdata = self.line.get_xdata()
self.line.set_xdata(p2w(xdata))