2017-06-09 79 views
0

我正在用PyQt开发一个桌面应用程序,并使用matplotlib绘制数据(列表为32个浮点数)。数据通过一定的时间间隔持续来自嵌入式设备,每当新数据即将到来时,通知应用程序并自动(通过连接)将数据绘制到画布上。这按预期工作。matplotilb:只使用现有数据更新坐标轴

现在我想实现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

看完这个,我有问题的理解实际的问题。什么是问题?什么答案需要包含来解决你的问题? – ImportanceOfBeingErnest

+0

对不起,我同意这是非常糟糕的解释。我做了一些编辑,希望现在更容易理解。 – m5seppal

回答

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))