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

文章目录

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

Python绘图系统:

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

单轴导入

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

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

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

def mImportOne(self):flag = askstring("设置参数", "请选择输出的轴")if flag not in self.getDim():showwarning("您输入的坐标轴并不存在")returnself.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("您输入的坐标轴并不存在")continueself.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) : returnself.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): continueself.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 npfrom aframe import AxisFrame, AskDct
from base import DrawType, DrawStyleclass 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 = Trueself.Click()# 初始化工具栏def initFeature(self, types, typeDct):frm = self._bfrm.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 = Falsetop.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]:returnself.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("您输入的坐标轴并不存在")continueself.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) : returnself.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): continueself.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)passdef 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 txyzself.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.showStyleif self.showStyle:self.sf.pack(side=tk.TOP, fill=tk.X)else:self.sf.pack_forget()self._s.height = 0def 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.xdnf.cn/news/145275.html

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

相关文章

华为乾坤区县教育安全云服务解决方案(2)

本文承接: https://blog.csdn.net/qq_37633855/article/details/133276200?spm1001.2014.3001.5501 重点讲解华为乾坤区县教育安全云服务解决方案的部署流程。 华为乾坤区县教育安全云服务解决方案(2) 课程地址解决方案部署整体流程组网规划…

AWS SAA知识点整理(作成中)

共通 一些信息已经更新了,但参考题的答案还是旧的。 比如: S3的最大读写性能已经提高到 3,500 PUT/COPY/POST/DELETE or 5,500 GET/HEAD requests per second 并且不再要求使用random prefix 题目中有时候会让选择Not violation 不合适的一项&#xff…

安卓玩机-----给app加注册码 app加弹窗 云注入弹窗

在对接很多工作室业务中有些客户需要在他们自带的有些app中加注册码或者验证码的需求。其实操作起来也很简单。很多反编译软件有自带的注入功能。例如注入弹窗。这个是需要对应的注册码来启动应用。而且是随机id。重新安装app后需要重新注册才可以继续使用,原则上可…

第7讲:v-bind属性绑定,v-model双向绑定,v-on事件监听使用

目录 1.v-bind双向绑定 2.v-model双向绑定 3.v-on事件绑定 一.v-bind双向绑定 1.v-bind 指令可以在其名称后面带一个参数,中间放一个冒号隔开,这个参数通常是HTML元素的特性(attribute),Vue官方提供了一个简写方式…

Spring Boot事件机制浅析

1、概述 在设计模式中,观察者模式是一个比较常用的设计模式。维基百科解释如下: 观察者模式是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼…

R语言分析:如何轻松地把数据分为三、四、五等份?

有网友问了,我如何对连续型资料进行分组,常见的有按照中位数分组、四分位数分组,甚至分为5组。 这个问题其实很简单的了。 用两个函数,一个是quantile函数,另外一个是cut函数 1. quantile()函数的应用 该函数目的是获得…

基于Web的在线学习平台设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

Java后端接口编写流程

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Java后端接口编写流程 Java后端接口编写流程,更具业务逻辑编写Java后端接口,提供给前端访问 实现逻辑流程 POJO:实体类编写 Data B…

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

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

SpringBoot——常用注解

Spring Web MVC与Spring Bean注解 Controller/RestController Controller是Component注解的一个延伸,Spring 会自动扫描并配置被该注解标注的类。此注解用于标注Spring MVC的控制器。 Controller RequestMapping("/api/v1") public class UserApiContr…

【计算机视觉】3.传统计算机视觉方法

传统计算机视觉方法 一、大纲图像分割人脸检测行人检测 二、图像分割基于阈值检测的方法基于边缘检测的方法基于区域的分割方法基于图论的分割方法 三、人脸检测四、行人检测五、SVM六、DPM 一、大纲 图像分割 基于阈值、基于边缘 基于区域、基于图论 人脸检测 Haar-like 特征…

IntelliJ IDEA 上 使用git 合并其他分支,合并某一个提交

git 合并其他分支 找到git——>merge… 选择需要合并的分支,不能选和当前分支一样噢 合并,推送即可 合并某个提交到其他分支 点击左下角git——>右键切换分支——>选择需要合并的分支——>选择需要合并的代码——>ch 推送即可

【AI视野·今日NLP 自然语言处理论文速览 第三十八期】Thu, 21 Sep 2023

AI视野今日CS.NLP 自然语言处理论文速览 Thu, 21 Sep 2023 Totally 57 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Chain-of-Verification Reduces Hallucination in Large Language Models Authors Shehzaad Dhuliawala, Mojt…

Leetcode684. 冗余连接

Every day a Leetcode 题目来源:684. 冗余连接 解法1:并查集 因为需要判断是否两个节点被重复连通,所以我们可以使用并查集来解决此类问题。 代码: /** lc appleetcode.cn id684 langcpp** [684] 冗余连接*/// lc codestart…

LeetCode —— 回溯

77. 组合 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 示例&#xff1a;输入&#xff1a;n 4, k 2 输出&#xff1a; [ [1,2], [1,3], [1,4], [2,3], [2,4], [3,4]] class Solution {List<List<Integer>> list new…

【100天精通Python】Day67:Python可视化_Matplotlib 绘制动画,2D、3D 动画 示例+代码

1 绘制2D动画&#xff08;animation&#xff09; Matplotlib是一个Python绘图库&#xff0c;它提供了丰富的绘图功能&#xff0c;包括绘制动画。要绘制动画&#xff0c;Matplotlib提供了FuncAnimation类&#xff0c;允许您创建基于函数的动画。下面是一个详细的Matplotlib动画示…

【AI视野·今日CV 计算机视觉论文速览 第257期】Fri, 29 Sep 2023

AI视野今日CS.CV 计算机视觉论文速览 Fri, 29 Sep 2023 Totally 99 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Learning to Transform for Generalizable Instance-wise Invariance Authors Utkarsh Singhal, Carlos Esteves, Ameesh M…

升级:远程桌面软件玩游戏指南

你有没有遇到过这样的场景&#xff1a;你想玩一款特定的游戏&#xff0c;但却受到设备功能的限制&#xff1f;这就是游戏远程桌面的概念变得非常宝贵的地方。从本质上讲&#xff0c;它允许您远程利用高端游戏计算机的功能&#xff0c;使您能够在自己的设备上玩游戏。 可以考虑…

面向对象之旅:核心理念、设计方法与UML详解(软件设计师笔记)

&#x1f600;前言 面向对象技术是现代软件工程的核心&#xff0c;为软件设计和开发带来了一种强大且有序的方法。通过将现实世界的实体和概念映射到可操作的代码结构&#xff0c;该技术使我们能够更高效、清晰和可靠地创建复杂的软件系统。在本章中&#xff0c;我们将详细介绍…

VS编译器常见的错误

以上问题在编译器中出现可以在编译器中最上面加入&#xff1a; #define_CRT_SECURE_NO_WARNINGS 或者将scanf修改为scanf_s 一定要在最上端&#xff01;&#xff01;&#xff01;最上端&#xff01;&#xff01;&#xff01;最上端加入&#xff01;&#xff01;&#xff01; 虽…