私はpythonが初めてです(2日前に勉強を始めました)。計算結果を XY の形式で表示し、それに対応する Z 値を GUI に表示してから、単一の点を選択し、関連する関数を新しいウィンドウにプロットできるようにしたいと考えています。X と Y は規則的に変化し、長方形の基底を形成します。
この時点で、tkinter と matplotlib を使用してチャンスを試しています。これまでのところ、データ セット内の点を確実に選択することはできません。問題は、データの 3D の性質です。実際の 3D プロットではなく、Z 値の色分けだけで 2D 画像を生成するのが最善かもしれないと考えていますが、それは可能ですか?
これが私の現在の状況です (データ ファイルを XY と Z の自動生成された値の小さなセットに置き換えましたが、私のデータは実際には約 100 万ポイントなので、表示はかなり遅くなります):
#!/usr/bin/env python3
import re
import array as arr
from tkinter import *
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.backends.backend_tkagg import (
FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.figure import Figure
class MyApp(Tk):
def __init__(self,fname):
"""GUI builder"""
Tk.__init__(self)
self.title('Indicateur de la qualité du tampon')
#self.can = Canvas(self, width=250, height =100, bg ='ivory')
#self.can.grid(row =1, column =1, columnspan =3, pady =5, padx =5)
Button(self, text="Buffer index", command=self.pvoirTpon).pack(side=LEFT)
self.openDatafile(fname)
self.fig = Figure(figsize=(5, 4), dpi=100)
self.canvas = FigureCanvasTkAgg(self.fig, master=self)
self.canvas.draw()
self.ax = self.fig.add_subplot(111, projection="3d")
self.ax.plot_trisurf(self.rC, self.rpK, self.dpka, cmap='viridis', alpha=1)
self.ax.set_picker(True)
self.ax.view_init(90, 0)
self.ax.set_xlabel('r_C')
self.ax.set_ylabel('r_{pK}')
self.ax.set_zlabel('dpka')
self.toolbar = NavigationToolbar2Tk(self.canvas, self)
self.toolbar.update()
self.canvas.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1)
self.xdata = 0.0
self.ydata = 0.0
self.zdata = 0.0
self.fig.canvas.mpl_connect('button_press_event', self.onpick)
self.mainloop()
def onpick(self,event):
print('%s click: button=%d, x=%d, y=%d, xdata=%f, ydata=%f' %
('double' if event.dblclick else 'single', event.button,
event.x, event.y, event.xdata, event.ydata))
print(self.gety(event.xdata, event.ydata))
def gety(self,x,y):
b = self.ax.button_pressed
self.ax.button_pressed = -1
s = self.ax.format_coord(x,y)
self.ax.button_pressed = b
return s
def pvoirTpon(self):
"""displays buffer index"""
def openDatafile(self,fname):
self.rC = arr.array('d')
self.rpK = arr.array('d')
self.dpka = arr.array('d')
self.nbp = 0
for i in range(1,10):
for j in range(1,10):
self.nbp += 1
self.rC.append(0.4*i)
self.rpK.append(1.0*j)
self.dpka.append(i*j)
myfic='whatever'
f = MyApp(myfic)
ビジュアライゼーションからデータ ポイントを実際に選択する方法についての提案は大歓迎です。
すてきな一日を、
マルク