Python绘图系统23:导入多个坐标轴的数据

news2025/1/19 23:08:53

文章目录

    • 单轴导入
    • 多轴导入
    • 多文件导入
    • 合并导入
    • 源代码

Python绘图系统:

  • 前置源码: Python打造动态绘图系统
  • 📈一 三维绘图系统 📈二 多图绘制系统📈三 坐 标 轴 定 制
  • 📈四 定制绘图风格 📈五 数据生成导入📈六 三维动态演示
  • 坐标列表进阶:导出数据📌系统菜单

单轴导入

在功能菜单中,提供了三种文件导入接口,分别是单轴导入、合并导入和多文件导入。其中最简单的是单轴导入,毕竟此前已经在AxisFrame中创建了导入文件的功能。

但AxisFrame设置了两种导入模式,右键为复杂模式,可以设置导入信息;左键为简单模式,只按照上次导入的信息来导入文件。那么AxisList中的单轴导入,设为哪种模式比较好呢?

一般来说,如果坐标轴已经处于文件导入模式,那么显然没有必要在AxisList中导入文件,所以从功能菜单进入并打开单轴文件时,一定是尚未设置坐标轴格式的时候,所以选择复杂模式比较合理。

def mImportOne(self):
    flag = askstring("设置参数", "请选择输出的轴")
    if flag not in self.getDim():
        showwarning("您输入的坐标轴并不存在")
        return
    self.afs[flag].setMode("外部导入")
    self.afs[flag].slctChanged(None)
    self.afs[flag].btnImportComplex(None)  

效果如下

在这里插入图片描述

多轴导入

单轴导入的第一步是输入导入文件所在的坐标轴,但目前来说,我们并没有完全发挥出这个简单的参数对话框的功能。因为这里明明是可以输入多个坐标轴的。

所以,接下来就升级其功能,首先把“单轴导入”的字样编程“按坐标轴”,这样可以更加清晰,然后给上一个提示。

修改后的代码如下,这样就可以同时导入多个坐标轴的数据了。

def mImportOne(self):
    fs = askstring("设置参数", "坐标轴间按照逗号分开")
    fs = fs.replace(",", ",").split(',')
    for f in fs:
        if f not in self.getDim():
            showwarning("您输入的坐标轴并不存在")
            continue
        self.afs[f].setMode("外部导入")
        self.afs[f].slctChanged(None)
        self.afs[f].btnImportComplex(None)        

多文件导入

由于有了多轴导入这个操作,所以多文件操作在调用AxisFrame中的函数的时候,就可以使用更加简单快捷的导入方式。

def mImportAll(self):
    FILES = [('文本文件', 'txt'), ('文本文件', 'csv'), 
        ('二进制文件', 'bin')]
    fs = askopenfilenames(filetypes=FILES)
    for i,f in enumerate(self.getDim()):
        if i == len(fs) : return
        self.afs[f].setMode("外部导入")
        self.afs[f].slctChanged(None)
        self.afs[f].btnImportSimple(None)        

这里面FILES作为文件夹筛选列表,显然是个常量,而且会被诸多组件所调用。类似的常量也会越来越多,为了便于管理,提高代码的复用率,其实很有必要做一个文件,专门用于存放常量,这个以后再说。

合并导入

合并导入与合并输出在逻辑上是对偶关系,合并输出是将所有文件合在一起后,输出为二进制或者csv,那么合并导入就应该是这个过程的逆过程。

def mImportMerge(self):
    FILES = [('numpy数组', 'npy'), ('文本文件', 'csv')]
    path = askopenfilename(filetypes=FILES)
    if path.endswith('.npy'):
        data = np.load(path)
    else:
        data = np.loadtxt(path)
    for i,f in enumerate(self.getDim()):
        if i == len(data): continue
        self.afs[f].setMode("外部导入")
        self.afs[f].slctChanged(None)
        self.afs[f].data = data[i]

源代码

最后,附上修改后的alist.py的源代码

import tkinter as tk
import tkinter.ttk as ttk
from tkinter.filedialog import *
from tkinter.simpledialog import *
from tkinter.messagebox import showwarning
import numpy as np

from aframe import AxisFrame, AskDct
from base import DrawType, DrawStyle

class AxisList(ttk.Frame):
    def __init__(self, master, 
        title, mode, widths, 
        types, typeDct,        # 绘图类型Combobox的参数
        **options):
        super().__init__(master, **options)
        self.pack()
        self.afs = {}
        self.data = {}

        self.initWidgets(title, widths)
        self.initFeature(types, typeDct)
        self.initAxis(mode, widths)
        self.initStyleFrame()
    
    def initWidgets(self, title, widths):
        self.btn = ttk.Button(self, text=title, width=sum(widths)+5,
            command=self.Click)
        self.btn.pack(side=tk.TOP, fill=tk.X, expand=tk.YES)
        self._c = ttk.Frame(self)       # 此为主控件
        self._b = ttk.Frame(self._c)    # 此外工具栏控件
        self._a = ttk.Frame(self._c)    # 此为坐标轴
        self._s = ttk.Frame(self._c)    # 此为绘图风格控件
        
        self._b.pack(side=tk.TOP)
        self._a.pack(side=tk.TOP)
        self._s.pack(side=tk.TOP)
        
        self.collapsed = True
        self.Click()
    
    # 初始化工具栏
    def initFeature(self, types, typeDct):
        frm = self._b
        frm.pack(pady=2, side=tk.TOP, fill=tk.X)
        btn = ttk.Menubutton(frm, text="功能",width=4)
        btn.pack(side=tk.LEFT)
        m = self.initFileMenu(btn)
        btn.config(menu=m)

        self.drawType = DrawType(frm, typeDct, 
            func=self.dimChanged)
        self.drawType.pack(side=tk.LEFT, padx=2)
        self.vis = {L : True for L in 'txyz'}

    # 设置菜单
    def initFileMenu(self, btn):
        top = tk.Menu(btn, tearoff=False)

        m = tk.Menu(top, tearoff=False)
        m.add_command(label="按坐标轴", command = self.mImportOne)
        m.add_command(label="合并导入", command = self.mImportMerge)
        m.add_command(label="多文件导入", command = self.mImportAll)
        top.add_cascade(label="导入", menu=m)

        m = tk.Menu(top, tearoff=False)
        m.add_command(label="合并导出", command = self.mExportMerge)
        m.add_command(label="全部导出", command = self.mExportAll)
        m.add_command(label="单轴导出", command = self.mExportOne)
        top.add_cascade(label="导出", menu=m)

        m = tk.Menu(top, tearoff=False)
        m.add_command(label="风格", command = self.btnShowStyle)
        self.showStyle = False
        top.add_cascade(label="窗口", menu=m)

        return top
    
    # 加载数据
    def btnLoadData(self):
        name = askopenfilename()
        data = np.genfromtxt(name)
        for i, flag in enumerate('xyz'):
            if i >= data.shape[1]:
                return
            self.setOneMode(flag, "外部导入")
            self.data[flag] = self.setData(flag, data[:,i])

    def mImportOne(self):
        fs = askstring("设置参数", "坐标轴间按照逗号分开")
        fs = fs.replace(",", ",").split(',')
        for f in fs:
            if f not in self.getDim():
                showwarning("您输入的坐标轴并不存在")
                continue
            self.afs[f].setMode("外部导入")
            self.afs[f].slctChanged(None)
            self.afs[f].btnImportComplex(None)        
    
    def mImportAll(self):
        FILES = [('文本文件', 'txt'), ('文本文件', 'csv'), 
            ('二进制文件', 'bin')]
        fs = askopenfilenames(filetypes=FILES)
        for i,f in enumerate(self.getDim()):
            if i == len(fs) : return
            self.afs[f].setMode("外部导入")
            self.afs[f].slctChanged(None)
            self.afs[f].btnImportSimple(None)        
            

    def mImportMerge(self):
        FILES = [('numpy数组', 'npy'), ('文本文件', 'csv')]
        path = askopenfilename(filetypes=FILES)
        if path.endswith('.npy'):
            data = np.load(path)
        else:
            data = np.loadtxt(path)
        for i,f in enumerate(self.getDim()):
            if i == len(data): continue
            self.afs[f].setMode("外部导入")
            self.afs[f].slctChanged(None)
            self.afs[f].data = data[i]
    
    def mExportMerge(self):
        FILES = [('numpy数组', 'npy'), ('文本文件', 'csv')]
        path = asksaveasfilename(filetypes=FILES, initialfile=True)
        arr = np.array([self.afs[flag].data for flag in self.getDim()])
        if path.endswith('.npy'):
            arr.tofile(path)
        else:
            np.savetxt(path, arr, delimiter=', ')

    def mExportAll(self):
        path = askdirectory()
        for flag in self.getDim():
            #self.afs[flag].save(path)
            pass
    
    def mExportOne(self):
        flag = askstring("请选择输出的轴")
        if flag not in self.getDim():
            showwarning("您输入的坐标轴并不存在")
        #self.afs[flag].save()

    # 初始化坐标轴
    def initAxis(self, mode, widths):
        for flag in 'txyz':
            self.afs[flag] = AxisFrame(self._a, flag, mode, widths)
            self.afs[flag].pack(side=tk.TOP, fill=tk.X)
        self.vis = {L : L in self.getDim() for L in 'txyz'}
        self.updateVisible()
    
    # 初始化风格控件
    def initStyleFrame(self):
        self.sf = ttk.LabelFrame(self._s, text="绘图风格")
        self.drawStyle = DrawStyle(self.sf)
        self.drawStyle.pack(side=tk.TOP, fill=tk.X)
        
    # 维度改变时的回调函数
    def dimChanged(self, evt):
        txyz = self.getDim()
        for flag in 'txyz':
            self.vis[flag] = flag in txyz
        self.updateVisible()
    
    # 更新隐藏和显示
    def updateVisible(self):
        for flag in 'txyz':
            self.afs[flag].pack_forget()
        for flag in 'txyz':
            if self.vis[flag]:
                self.afs[flag].pack(side=tk.TOP, fill=tk.X)
    
    def btnShowStyle(self):
        self.showStyle = not self.showStyle
        if self.showStyle:
            self.sf.pack(side=tk.TOP, fill=tk.X)
        else:
            self.sf.pack_forget()
            self._s.height = 0

    def getSub(self):
        return self.drawType.getSub()

    def getProj(self):
        return self.drawType.getProj()

    def getType(self):
        return self.drawType.getType()
    
    def getDim(self):
        return self.drawType.getDim()

    def getXYZ(self):
        return self.getDim().replace("t", "")
    
    def hasTimeAxis(self):
        return "t" in self.getDim()
    
    def getStyle(self):
        return self.drawStyle.getVarDct()


    def Click(self):
        if self.collapsed:
            self._c.pack(side=tk.TOP, fill=tk.BOTH, expand=tk.YES)            
        else:
            self._c.pack_forget()
        self.collapsed = not self.collapsed

    # 设置数据
    def setData(self, flag, data=None, **options):
        return self.afs[flag].setData(data, **options)
    
    # 设置模式
    def setOneMode(self, flag, mode):
        self.afs[flag].setMode(mode)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1051732.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第一章 数据可视化和matplotlib

Python数据可视化 第一章 数据可视化和matplotlib 1.数据可视化概述 1.1.什么是数据可视化 ​ 数据可视化旨在借助图形化的手段,将一组数据以图形的形式表示,并利用数据分析和开发工具发现其中未知信息的处理过程。 ​ 数据可视化发展历史 ​ 可视化…

Spring IOC容器实例化Bean整体流程图

SpringBean实例化的基本流程-CSDN博客 Spring容器中的BeanDefinitionReader读取器,读取xml配置文件,解析每一个bean标签,将bean标签中信息封装到BeanDefinition对象中,该对象的集合存储到BeanDefinitionMap中,然后Spri…

Cocos Creator3.8 实战问题(三)去除scrollview背景色和label 对齐方式设置无效问题

1、 scrollview 默认背景是白色的, 我们不想要 scrollview 默认的背景颜色,怎么办? 设置 scrollview的color为透明吗? 不对,这会导致 view节点完全透明。 解决方法:直接删除scrollview 的Spritre frame就…

船用低速发动机缸压在线监测系统

LabVIEW开发船用低速发动机缸压在线监测系统 船用发动机结构复杂,部件相互连接,运行环境恶劣,使其更容易发生故障。如果船用发动机发生故障或工作状态不佳,将增加造成经济损失和威胁船舶安全的机。为了减少故障的发生&#xff0c…

【Kettle】Kettle部署与运行

一、部署 1.安装java 此处安装openjdk1.8,可用yum、apt、源码等方式安装,具体安装方式略。 2.安装kettle 1.下载 https://www.hitachivantara.com/en-us/products/pentaho-platform/data-integration-analytics/pentaho-community-edition.html 此…

Unity中UI Shader遮罩RectMask2D

文章目录 前言一、需要定义一个变体UNITY_UI_CLIP_RECTUNITY_UI_CLIP_RECT 二、需要申明一个_ClipRect,这是使用上面这个变体需要使用的,这个属性并没有在Properties声明1、现在我们用简单的代码测试一下 _ClipRect 的使用然后我们基于以上的基础,让 内层…

二、局域网联机

目录 1.下载资源包 2.配置NetworkManager 3.编写测试UI 1.下载资源包 2.配置NetworkManager (1)在Assets/Prefabs下创建Network Prefabs List 相应设置如下: (2) 创建空物体“NetworkManager”并挂载NetworkMan…

MySQL数据库——索引(5)-索引使用(上),验证索引效率、最左前缀法则、范围查询、索引失效情况、SQL提示

目录 索引使用 验证索引效率 最左前缀法则 范围查询 索引失效情况 索引列运算 字符串不加引号 模糊查询 or连接条件 数据分布影响 SQL提示 use index ignore index force index 索引使用(上) 验证索引效率 在讲解索引的使用原则之前&…

c语言常用语法,长时间不用容易忘。

关键字 auto 声明自动变量const 定义常量,如果一个变量被 const 修饰,那么它的值就不能再被改变extern 声明变量或函数是在其它文件或本文件的其他位置定义register 声明寄存器变量signed 声明有符号类型变量或函数static 声明静态变量,修饰…

毅速课堂:3D打印随形水路在小零件注塑中优势明显

小零件注塑中的冷却不均匀问题常常导致烧焦现象的发生。这主要是因为传统机加工方法无法制造出足够细小的水路,以适应小零件的复杂形状。而3D打印技术的引入,尤其是随形水路的设计,为解决这一问题提供了新的解决方案。 3D打印随形水路技术的优…

3.canvas绘制基本图形——圆弧

圆弧是圆的组成部分,一个圆可以看成多个圆弧或者一个圆弧闭环组合而成。因此我们画圆弧的时候往往把他看成一个残缺的圆 arc arc是最基础最简单的圆弧绘制方法。 他有六个参数 参数一跟参数二表示圆的圆心坐标 参数三是圆的半径 参数四是圆开始的角度 参数五是圆结…

No module named ipykernel解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

HTML的相关知识

1.什么是HTML?基本语法 HTML: Hyper Text Markup Language (超文本标记语言) 超文本?超级文本,例如流媒体,声音、视频、图片等。 标记语言?这种语言是由大量的标签组成。HTML标签参考手…

单目标应用:基于沙丁鱼优化算法(Sardine optimization algorithm,SOA)的微电网优化调度MATLAB

一、沙丁鱼优化算法 沙丁鱼优化算法(Sardine optimization algorithm,SOA)由Zhang HongGuang等人于2023年提出,该算法模拟沙丁鱼的生存策略,具有搜索能力强,求解精度高等特点。 沙丁鱼主要以浮游生物为食,这些生物包括细菌、腔肠…

SpringBoot整合RabbitMQ实现延迟队列功能

👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的编码爱好者 大家好,我是 DevO…

AOP 编程

目录 ​编辑一、AOP 编程 1、AOP 概念 2、AOP 编程的开发步骤 3、切面的名词解释 二、AOP 的底层实现原理 1、核心问题 2、动态代理类的创建 (1)JDK 的动态代理创建 (2)CGlib 的动态代理 (3)总结…

[红明谷CTF 2021]write_shell %09绕过过滤空格 ``执行

目录 1.正常短标签 2.短标签配合内联执行 看看代码 <?php error_reporting(0); highlight_file(__FILE__); function check($input){if(preg_match("/| |_|php|;|~|\\^|\\|eval|{|}/i",$input)){ 过滤了 木马类型的东西// if(preg_match("/| |_||php/&quo…

设计模式5、原型模式 Prototype

解释说明&#xff1a;使用原型实例指定待创建对象的类型&#xff0c;并且通过复制这个原型阿里创建型的对象 UML 结构图&#xff1a; 抽象原型&#xff08;Prototype&#xff09;&#xff1a;规定了具体原型对象必须实现的clone()方法 具体原型&#xff08;ConcretePrototype&…

CVE-2023-5129 libwebp堆缓冲区溢出漏洞影响分析

漏洞简述 近日苹果、谷歌、Mozilla和微软等公司积极修复了libwebp组件中的缓冲区溢出漏洞&#xff0c;相关时间线如下&#xff1a; 9月7日&#xff0c;苹果发布紧急更新&#xff0c;修复了此前由多伦多大学公民实验室报告的iMessage 0-click 漏洞&#xff0c;漏洞被认为已经被…

爬取北京新发地当天货物信息并展示十五天价格变化(三)---获取物品十五天内的价格

。。。。。。。。。。。。。。。。。。。。。。 1.网页请求一下内容2.通过爬虫进行请求3.获取商品十五天详细数据并绘制折线图4.项目详细代码 1.网页请求一下内容 通过抓包我们发现一共七个参数 limit: 20 # 一页多少数据 current: …