我正在使用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中的轴,而不是触摸缩放或数据,而是使用现有值?
答案 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))