5

いくつかのデータ (x,y) をグラフ化する がmatplotlib hexbin埋め込まれています。( 経由で) 新しいデータを受信したときに を更新しGTK.Windowたい。しかし、私はいくつかの問題を抱えています。plotUDP

いくつかの異なる方法で動作させることができますが、どれも「効率的」ではありませんでした (つまり、再描画にplot時間がかかりすぎます)。私はここを見て、提案された答えの後にヘックスビンをモデル化しようとしましたが、これをまったく機能させることができませんでした。次のエラーが表示され続けます。

TypeError: 'PolyCollection' object is not iterable.

hexbinsstandard と同じ方法で更新することはできないと思いplotsます。

サンプルコード:

class graph:
    def __init__(self):
        self.window = gtk.Window()
        self.figure = plt.figure()
        self.ax = self.figure.add_subplot(111)
        self.canvas = FigureCanvas(self.figure)
        self.window.add(self.canvas)

        self.graph = None

    def plot(self, xData, yData):
        if len(xData) > 1 and len(yData) > 1:
            self.graph, = self.ax.hexbin(self.xData, self.yData) 
            ###############################################
            ####This is where the code throws the error####

    def update(self, xData, yData):
        self.graph.set_xdata(np.append(self.graph.get_xdata(), xData))
        self.graph.set_ydata(np.append(self.graph.get_ydata(), yData))
        self.figure.canvas.draw()

コードは次のように使用されます。

graph = graph()
graph.plot(someXData, someYData)
# when new data is received
graph.update(newXData, newYData)

これは、私がコードをどのように使用しているかを示す非常に小さな例です。私はあまり経験がないmatplotlibので、これについて完全に間違っている可能性があります。(これはおそらく私がやっていることです)

だから私の最終的な質問は -どのようにmatplotlib hexbinプロットを更新しますか?


編集: danodonovan の回答のおかげで、コードを変更し、後の「,」を削除しましたself.graph = self.ax.hexbin(...)

スローされる新しいエラーは次のとおりです。AttributeError: 'PolyCollection' object has no attribute 'set_xdata'

4

3 に答える 3

2

この線:

 self.graph, = self.ax.hexbin(self.xData, self.yData)

(それがスタックトレースが例外をスローしている場合)はコンマが原因であり、それself.ax.hexbinが反復可能なオブジェクトであることを意味します。に変更

 self.graph = self.ax.hexbin(self.xData, self.yData)

を停止する場合がありTypeError exceptionます。次回は、スタック トレースにさらに数行追加してください。

于 2013-02-06T17:16:43.570 に答える
2

これは現在実行できるとは思いませんhexbin。x、y のリストを変換します -> ポリゴンのコレクション。は、頂点、エッジ、および面の色のpolyCollection単なるリストであり、生成方法に関するセマンティック情報は含まれていないと思います。

最良のアプローチは、古いものを壊してhexbin新しいものに置き換えることです。

本当にその場で更新できるようにしたい場合は、正方形の 2D ヒストグラムを使用するか ( を使用できるようにします)、パッチのリストを返すようにimshow変更して ( の代わりに)、自分自身のビニングを追跡します。hexbinpolyCollection

于 2013-02-06T20:28:41.810 に答える
0

予想される質問に答えるには、電話する代わりに、のset_xdataようなものを試してくださいupdate_from。私はこれがうまくいくとは約束していませんが、私は試してみます

def update(self, xData, yData):
    # update your data structures
    self.xData = np.append(self.xData, xData)
    self.yData = np.append(self.yData, yData)

    # create a new hexbin - not connected to anything, with the new data
    new_hexbin = self.ax.hexbin(self.xData, self.yData)

    # update the viewed hexbin from the new one
    self.graph.update_from(new_hexbin)
    self.figure.canvas.draw()

これ以上のコードや説明がなければ、これは実際には単なる推測作業であることに注意してください。このクラスのドキュメントはここにあり、update_fromメソッドは親クラスからのものです。

于 2013-02-06T17:33:12.620 に答える