1

GTK コンテナーに埋め込まれたプロットを作成するプロジェクトに取り組んでおり、x 軸と y 軸の境界をクリックして境界を変更できるようにする必要があります。

これは、これまでのピッキングイベントを作成するために必要なものです

def makepickers(self):
    xaxis = self.ax.get_xticklabels()
    yaxis = self.ax.get_yticklabels()
    self.axlbls = (xaxis[0], xaxis[-1], yaxis[0], yaxis[-1])
    for entry in self.axlbls:
        entry.set_picker(True)

目盛りラベルを取得し、各軸の上限と下限に対してピッカー プロパティを true に設定します。

制限をダブルクリックすると、ポップアップして制限に関する入力を求めるgtkダイアログが作成され、軸に渡され、グラフのサイズが変更され、ピッカーが再作成されます

def onpick(self, event):
    pickedtick = event.artist
    if event.mouseevent.dblclick:
        dialog = gtk.Dialog(title='Set Limits',
                            parent=None,
                            flags=0,
                            buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK))
        lbl = gtk.Label("Set Axis Limit")
        entry = gtk.Entry()
        dialog.vbox.pack_start(lbl, True, True, 0)
        dialog.vbox.pack_start(entry, True, True, 0)
        entry.show()
        lbl.show()
        response = dialog.run()
        if response == gtk.RESPONSE_OK:
            newlim = float(entry.get_text())
        dialog.destroy()
        idx = self.axlbls.index(pickedtick)
        if self.lim_option_x == 'Manual':
            if idx == 0: # x lower limit
                self.ax.set_xlim(left=newlim)
            if idx == 1: # x upper limit
                self.ax.set_xlim(right=newlim)
        if self.lim_option_y == 'Manual':
            if idx == 3: # y upper limit
                self.ax.set_ylim(top=newlim)
            if idx == 2: # y lower limit
                self.ax.set_ylim(bottom=newlim)
        del self.axlbls
        self.ax.relim()
        self.ax.autoscale_view()
        self.canvas.draw()
        self.makepickers()

「手動」オプションは、クラス内にあるチェックボックス (軸ごとにオン) によって決定されます。

私の問題は、制限のサイズを変更するときに最初の数回は機能することですが、それが示す場所にエラーが表示されることがよくあります。

    idx = self.axlbls.index(pickedtick)
ValueError: <matplotlib.text.Text object at 0x02D00870> is not in list

これも一貫したエラーではありません。キャンバスが再描画されるか、軸を再描画する可能性のあるグラフに新しいポイントが追加されるたびに、ピッカーを作り直します。なぜこれが起こっているのかについて誰かがアイデアを持っているかどうかはわかりません。助けていただければ幸いです。

4

0 に答える 0