2017-06-09 2 views
0

私はPyQtでデスクトップアプリケーションを開発しており、matplotlibを使ってデータ(32個の浮動小数点数のリスト)をプロットしています。データは埋め込まれたデバイスから一定の時間間隔で連続的に送られ、新しいデータが来るたびにアプリケーションに通知され、自動的に(接続経由で)データがキャンバスにプロットされます。これは期待どおりに動作します。matplotilb:既存のデータを使って軸だけを更新する

Y軸とX軸の単位選択を実装したいと思います。ラジオ選択ボタンを使用すると、Y軸には5つのオプションがあり、X軸には2つのオプションがあります。ユーザーがいずれかの軸の単位選択を変更すると、既存のデータを新しい単位選択で置換する必要があります。もう1つは、更新時にズームレベルを保持することです。

これは(ズームレベルを保持します)私の現在のプロット関数である:X軸の

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

単位選択は(ピクセルまたは波長)を示すために、どのユニットに影響を与えているとそれがないので、それは線形ですデータの形状に影響を与えます。 Y軸の単位選択は、calculate_spectrum_values()メソッドで何が起こるかに影響します。私は、異なる選択肢を持つデータに対して異なる数学を行います。ユニットの選択を変更する別の方法があります。 X軸の場合には、以下のようなものだ:新しいデータが約1秒間隔で来るので、その時に新しいデータは常に新しいユニットの選択により更新される内のように、測定は、実行されている場合

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

まず、あるユニットから別のユニットに変換する方法を紹介する必要があります。この場合、2つの間に線形関係があり、非常に簡単です。

#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)) 
関連する問題