0

我是 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)

任何关于如何从可视化中实际选择数据点的建议都将非常受欢迎!

祝你有美好的一天,

马克

4

0 回答 0