亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python編寫繪圖系統(tǒng)之從文本文件導(dǎo)入數(shù)據(jù)并繪圖

 更新時(shí)間:2023年08月10日 08:29:52   作者:微小冷  
這篇文章主要為大家詳細(xì)介紹了Python如何編寫一個(gè)繪圖系統(tǒng),可以實(shí)現(xiàn)從文本文件導(dǎo)入數(shù)據(jù)并繪圖,文中的示例代碼講解詳細(xì),感興趣的可以了解一下

Python繪圖系統(tǒng)系列:將matplotlib嵌入到tkinter 簡(jiǎn)單的繪圖系統(tǒng)

導(dǎo)入數(shù)據(jù)

單純從作圖的角度來(lái)說(shuō),更多情況是已經(jīng)有了一組數(shù)據(jù),然后需要將其繪制。這組數(shù)據(jù)可能是txt格式的,也可能是csv格式的,還可能是二進(jìn)制數(shù)據(jù)。當(dāng)然,這些一會(huì)兒在想,首先就是要添加一個(gè)按鈕,將 setCtrlButtons 函數(shù)添加一行:

def setCtrlButtons(self, frm):
    ttk.Button(frm, text="繪圖",width=5,
        command=self.btnDrawImg).pack(side=tk.LEFT)
    ttk.Button(frm, text="加載",width=5,
        command=self.btnLoadData).pack(side=tk.LEFT)

然后就可以考慮 self.btnLoadData 函數(shù)了。

簡(jiǎn)潔起見(jiàn),以后將不再具體展示 setCtrlButtons 的具體代碼,而只是寫出新增的代碼。

文件對(duì)話框

加載數(shù)據(jù),其實(shí)就是加載文件,那么文件對(duì)話框就很重要。

tkinter.filedialog 中的 askopenfilename 就是文件對(duì)話框,預(yù)感這個(gè)函數(shù)可能不止一處出現(xiàn),故而導(dǎo)入一下,以方便調(diào)用

from tkinter.filedialog import askopenfilename

這個(gè)函數(shù)的好處是,只返回讀取到的文件名,而不像 askopenfile 一樣返回一個(gè)文件對(duì)象。

self.btnLoadData 函數(shù),如果只是想實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的功能,那么可以寫為

def btnLoadData(self):
    name = askopenfilename()
    data = np.genfromtxt(name)
    if data.shape[1] < 2:
        return
    self.xs = data[:,0]
    self.ys = data[:,1]
    self.drawPlot()

效果如下

修改繪圖邏輯

現(xiàn)在,我們有了兩種數(shù)據(jù)生成模式,一是用語(yǔ)法生成,二是通過(guò)加載得到。但目前來(lái)說(shuō)這兩種生成方式并不兼容。為了解決這個(gè)問(wèn)題,可以為x和y的輸入框添加一個(gè)標(biāo)識(shí),比如當(dāng)x或者y的輸入框中是data的時(shí)候,再點(diǎn)擊繪圖,就可以選中加載后的數(shù)據(jù)。

由于tkinter中輸入Entry內(nèi)容比較繁瑣,所以封裝一個(gè)全局的函數(shù)專門用于更改Entry內(nèi)容

def setEntry(e, text):
    e.delete(0, "end")
    e.insert(0, text)

接下來(lái),將加載數(shù)據(jù)函數(shù)和繪圖函數(shù)分別改寫為

def btnLoadData(self):
    name = askopenfilename()
    data = np.genfromtxt(name)
    if data.shape[1] < 2:
        return
    self.xs = data[:,0]
    setEntry(self.xEntry, "data")
    self.ys = data[:,1]
    setEntry(self.yEntry, "data")
def btnDrawImg(self):
    xLab = self.xEntry.get()
    if xLab != "data":
        x = eval(f"np.linspace({xLab})")
        self.xs = x
    else:
        x = self.xs
    yLab = self.yEntry.get()
    if yLab != "data":
        self.ys = eval(yLab)
    self.drawPlot()

在btnLoadData函數(shù)中,取消了繪圖功能,而是在導(dǎo)入數(shù)據(jù)后,將xEntry和yEntry的內(nèi)容設(shè)置為"data"。

而繪圖函數(shù)中,檢測(cè)xEntry和yEntry的內(nèi)容,如果是data,那么說(shuō)明已經(jīng)讀取到了相關(guān)數(shù)據(jù),就直接調(diào)用,而非重新生成。

源代碼

最后,把源代碼附在下面

import tkinter as tk
import tkinter.ttk as ttk
from tkinter.filedialog import askopenfilename
import matplotlib as mpl
mpl.use('TkAgg')
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import (
    FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.figure import Figure
import numpy as np
def setEntry(e, text):
    e.delete(0, "end")
    e.insert(0, text)
class DarwSystem():
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("數(shù)據(jù)展示工具")
        frmCtrl = ttk.Frame(self.root,width=320)
        frmCtrl.pack(side=tk.RIGHT, fill=tk.Y)
        self.setFrmCtrl(frmCtrl)
        frmFig = ttk.Frame(self.root)
        frmFig.pack(side=tk.LEFT,fill=tk.BOTH,expand=tk.YES)
        self.setFrmFig(frmFig)
        self.root.mainloop()
    def setFrmCtrl(self, frmCtrl):
        frm = ttk.Frame(frmCtrl, width=320)
        frm.pack(side=tk.TOP, fill=tk.X)
        self.setCtrlButtons(frm)
        frm = ttk.Frame(frmCtrl)
        frm.pack(side=tk.TOP, fill=tk.X)
        self.setFrmX(frm)
        frm = ttk.Frame(frmCtrl)
        frm.pack(side=tk.TOP, fill=tk.X)
        self.setFrmY(frm)
    def setFrmX(self, frm):
        tk.Label(frm, text="x").pack(side=tk.LEFT)
        self.xEntry = tk.Entry(frm)
        self.xEntry.pack(side=tk.LEFT, fill=tk.X)
    def setFrmY(self, frm):
        tk.Label(frm, text="y").pack(side=tk.LEFT)
        self.yEntry = tk.Entry(frm)
        self.yEntry.pack(side=tk.LEFT, fill=tk.X)
    def setCtrlButtons(self, frm):
        ttk.Button(frm, text="繪圖",width=5,
            command=self.btnDrawImg).pack(side=tk.LEFT)
        ttk.Button(frm, text="加載",width=5,
            command=self.btnLoadData).pack(side=tk.LEFT)
    def btnLoadData(self):
        name = askopenfilename()
        data = np.genfromtxt(name)
        if data.shape[1] < 2:
            return
        self.xs = data[:,0]
        setEntry(self.xEntry, "data")
        self.ys = data[:,1]
        setEntry(self.yEntry, "data")
    def btnDrawImg(self):
        xLab = self.xEntry.get()
        if xLab != "data":
            x = eval(f"np.linspace({xLab})")
            self.xs = x
        else:
            x = self.xs
        yLab = self.yEntry.get()
        if yLab != "data":
            self.ys = eval(yLab)
        self.drawPlot()
    def drawPlot(self):
        self.fig.clf()
        ax = self.fig.add_subplot()
        ax.plot(self.xs, self.ys)
        self.fig.subplots_adjust(left=0.1, right=0.95, top=0.95, bottom=0.08)
        self.canvas.draw()
        pass
    def setFrmFig(self, frmFig):
        self.fig = Figure()
        self.canvas = FigureCanvasTkAgg(self.fig,frmFig)
        self.canvas.get_tk_widget().pack(
            side=tk.TOP,fill=tk.BOTH,expand=tk.YES)
        self.toolbar = NavigationToolbar2Tk(self.canvas,frmFig,
            pack_toolbar=False)
        self.toolbar.update()
        self.toolbar.pack(side=tk.RIGHT)
if __name__ == "__main__":
    test = DarwSystem()

到此這篇關(guān)于Python編寫繪圖系統(tǒng)之從文本文件導(dǎo)入數(shù)據(jù)并繪圖的文章就介紹到這了,更多相關(guān)Python繪圖系統(tǒng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論