我是 python 新手(两天前开始学习它)。我想在 GUI 中以 XY 和相应的 Z 值的形式显示计算结果,然后能够选择一个点并在新窗口中绘制相关函数。X 和 Y 有规律地变化并形成一个矩形基础。
在这一点上,我正在尝试使用 tkinter 和 matplotlib。到目前为止,我无法在数据集中实际选择一个确定的点,问题在于数据的 3D 特性。我在想也许最好只用 Z 值的颜色编码而不是实际的 3D 绘图来生成 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)
任何关于如何从可视化中实际选择数据点的建议都将非常受欢迎!
祝你有美好的一天,
马克