Python绘图系统25:新增8种绘图函数
文章目录
- 常用绘图函数
- 单选框的更改逻辑
- 源代码
Python绘图系统:
- 前置源码: Python打造动态绘图系统
- 📈一 三维绘图系统 📈二 多图绘制系统📈三 坐 标 轴 定 制
- 📈四 定制绘图风格 📈五 数据生成导入📈六 三维动态演示
- 动图绘制:动图绘制🔥实现动图绘制系统
- 坐标列表进阶:导出数据📌系统菜单📌批量文件导入📌辅助坐标轴
- 绘图类型进阶:坐标映射📌八种绘图函数
常用绘图函数
目前只集成了三种绘图函数,即plot, scatter和bar,这个体量不到matplotlib提供的绘图函数的十分之一,接下来要做的自然是扩充绘图函数库。
但一次性也不宜扩充太多,下面列出一些常用的绘图函数,如无说明,小写的x,y,z表示一维数组;大写的X,Y,Z表示二维数组,也就是矩阵;❌表示这种绘图函数不支持这种坐标,或者不建议在这种坐标中绘图。
| 函数 | 类别 | 2D | polar | 3D | 备注 |
|---|---|---|---|---|---|
| imshow | 图像 | X | ❌ | ❌ | |
| pcolormesh | 伪彩图 | [X,Y,]Z | X,Y,Z | ❌ | |
| plot | 曲线图 | x[,y] | x[,y] | x,y[,z] | |
| scatter | 散点图 | x,y/X,Y | x,y | x,y,[,z] | 可为任意维度 |
| stem | 茎叶图 | x,y | x,y | x,y[,z] | |
| step | 阶梯图 | x,y | x,y | x,y[,z] | |
| bar | 条形图 | x,y | x,y | x,y[,z] | |
| barh | 横向条形图 | x,y | x,y | ❌ |
从这个图可以看出,2D坐标中,大部分函数只支持两个变量,极坐标亦然,而3D坐标中要么不支持绘图,要么支持x,y或者x,y,z三种绘图坐标。
单选框的更改逻辑
完成这个功能的改动,只需先更改cbTypeChanged,再更改cbProjNone, cbProjPolar以及cbProj3d这三个函数就可以了。
def cbTypeChanged(self, evt):t = self.drawVars['type'].get()p = self.drawVars['proj'].get()if t in ("图像"):self.wDct['proj']['value'] = ("None")elif t in ("横向条形图", "伪彩图"):self.wDct['proj']['value'] = ("None", "polar")else:self.wDct['proj']['value'] = ("None", "3d", "polar")projs = self.wDct['proj']['value']if p not in projs:self.drawVars['proj'].set(projs[0]) self.cbProjChanged(None)
接下来是设置projection的函数,之前我们一直把plot取名为点线图,这个先留着,但不妨碍把曲线图作为另一个名字加上去,但“点线图”这个名字暂时还不能删,因为DrawSystem那边的代码还没有改。
def cbProjNone(self, t):if t in ("点线图", "曲线图"):self.wDct['dim']['value'] = ('x', 'xy')elif t in ("图像"):self.wDct['dim']['value'] = ('x')elif t in ("伪彩图"):self.wDct['dim']['value'] = ('x', 'xyz')else:self.wDct['dim']['value'] = ('xy')def cbProjPolar(self, t):if t in ("点线图", "曲线图"):self.wDct['dim']['value'] = ('x', 'xy')elif t in ("伪彩图"):self.wDct['dim']['value'] = ('xyz')else:self.wDct['dim']['value'] = ('xy')def cbProj3d(self, t):self.wDct['dim']['value'] = ('xy', 'xyz')
最后,新建一个全局的常量,用于存储函数名,并在创建slctDct字典时调用。
def initConst(self):self.TYPES = ["点线图", "曲线图", "散点图", "图像", "伪彩图", "条形图", "横向条形图", "茎叶图", "阶梯图"]
修改后的结果如图所示

源代码
下面给出base.py的源代码。
import numpy as np
import tkinter as tk
import tkinter.ttk as ttkclass DrawStyle(ttk.Frame):def __init__(self, master, varDct={}, ws=None, func=None, **options):super().__init__(master, **options)self.pack()self.initConst()self.initVars()self.initWidgets()def initConst(self):self.VAR_LABS = {"线型" : "linestyle", "线宽" : "linewidth", "线色" : "color","点型" : "marker" , "点径" : "markersize", "点色" : "markeredgecolor","标签" : "label" , "透明度" : "alpha", "层号" : "zorder" }self.STR_KEYS = ["标签"]self.COM_KEYS = ["线型", "点型"]self.NUM_KEYS = ["线宽", "点径", "透明度"]self.INT_KEYS = ["层号"]self.CLR_KEYS = ["线色", "点色"]def initVars(self):self.varDct = {key:tk.StringVar() for key in self.VAR_LABS}def newFrame(self):frm = ttk.Frame(self)frm.pack(side=tk.TOP, fill=tk.X)return frmdef initWidgets(self):frm = self.newFrame()for i,key in enumerate(["标签", "层号", "透明度"]):tk.Label(frm, text=key).grid(row=0, column=i*2, padx=2)tmp = ttk.Entry(frm, width=10, textvariable=self.varDct[key])tmp.grid(row=0, column=i*2+1, padx=2, pady=2)self.initLineMarker(frm)def initLineMarker(self, frm):enumDct = {"点型" : ['.', ',', '1', '2', '3', '4', '+', 'x', '|', '_', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 'o', 'v', '^', '<', '>', '8', 's', 'p', '*', 'h', 'H', 'D', 'd', 'P', 'X'],"线型" : ['-', '--', '-.', ':']}for i in range(2):key = self.COM_KEYS[i]ttk.Label(frm, text=key).grid(row=i+1, column=0, padx=2)tmp = ttk.Combobox(frm, width=10, textvariable=self.varDct[key])tmp.grid(row=i+1, column=1, padx=2, pady=2)tmp['value'] = enumDct[key]key = self.NUM_KEYS[i]ttk.Label(frm, text=key).grid(row=i+1, column=2, padx=2)tmp = ttk.Entry(frm, width=10, textvariable=self.varDct[key])tmp.grid(row=i+1, column=3, padx=2, pady=2)key = self.CLR_KEYS[i]ttk.Label(frm, text=key).grid(row=i+1, column=4, padx=2)tmp = ttk.Entry(frm, width=10, textvariable=self.varDct[key])tmp.grid(row=i+1, column=5, padx=2, pady=2)def getOneVar(self, key):v = self.varDct[key].get()if v=="":return ""if key in NUM_KEYS:return float(v)elif key in INT_KEYS:return int(v)else:return vdef getVarDct(self):dct = {self.VAR_LABS[key] : self.varDct[key].get() for key in self.varDct}return {key : dct[key] for key in dct if dct[key]!=""}# 绘图类型和维度
# varDct 的格式是 {"sub":sub, "type":slctType, "dim":dim, "proj": proj}class DrawType(ttk.Frame):# ws为两个combobox的宽def __init__(self, master, varDct = {"sub":"111", "type":'点线图', "dim":"xyz", "proj": "3d"},ws=None, func=None, **options):super().__init__(master, **options)self.pack()self.dimChanged = funcself.initConst()self.initVar(varDct)self.initWidgets(ws)def initVar(self, varDct):self.drawVars = {key:tk.StringVar() for key in varDct}for key in self.drawVars:self.drawVars[key].set(varDct[key])def initConst(self):self.TYPES = ["点线图", "曲线图", "散点图", "图像", "伪彩图", "条形图", "横向条形图", "茎叶图", "阶梯图"]def initWidgets(self, ws):if ws==None: ws = [5, 5, 5, 3]slctDct = {'type': self.TYPES, 'proj': ("None", "3d", "polar"), 'dim' : ("x", "xy", "xyz")} # 绘图维度keys = ['sub', 'type', 'proj', 'dim']self.wDct = {} # 控件字典# 此为设置子图的Entry控件self.wDct['sub'] = ttk.Entry(self, width=ws[0], textvariable=self.drawVars['sub'])for i, key in enumerate(keys[1:], 1):self.wDct[key] = ttk.Combobox(self, width=ws[i], textvariable=self.drawVars[key])self.wDct[key]['value'] = slctDct[key]for key in keys:self.wDct[key].pack(side=tk.LEFT, padx=2)self.wDct['type'].bind('<<ComboboxSelected>>', self.cbTypeChanged)self.wDct['proj'].bind('<<ComboboxSelected>>', self.cbProjChanged)self.wDct['dim'].bind('<<ComboboxSelected>>', self.dimChanged)def cbTypeChanged(self, evt):t = self.drawVars['type'].get()p = self.drawVars['proj'].get()if t in ("图像"):self.wDct['proj']['value'] = ("None")elif t in ("横向条形图", "伪彩图"):self.wDct['proj']['value'] = ("None", "polar")else:self.wDct['proj']['value'] = ("None", "3d", "polar")projs = self.wDct['proj']['value']if p not in projs:self.drawVars['proj'].set(projs[0]) self.cbProjChanged(None)def cbProjChanged(self, evt):p = self.drawVars['proj'].get()func = {'None': self.cbProjNone,'3d': self.cbProj3d,'polar' : self.cbProjPolar}d = self.wDct['dim'].get()t = self.drawVars['type'].get()func[p](t)dims = self.wDct['dim']['value']if d not in dims:self.drawVars['dim'].set(dims[0])self.dimChanged(None)def cbProjNone(self, t):if t in ("点线图", "曲线图"):self.wDct['dim']['value'] = ('x', 'xy')elif t in ("图像"):self.wDct['dim']['value'] = ('x')elif t in ("伪彩图"):self.wDct['dim']['value'] = ('x', 'xyz')else:self.wDct['dim']['value'] = ('xy')def cbProjPolar(self, t):if t in ("点线图", "曲线图"):self.wDct['dim']['value'] = ('x', 'xy')elif t in ("伪彩图"):self.wDct['dim']['value'] = ('xyz')else:self.wDct['dim']['value'] = ('xy')def cbProj3d(self, t):self.wDct['dim']['value'] = ('xy', 'xyz')def getSub(self):return self.drawVars['sub'].get()def getType(self): return self.drawVars['type'].get()def getDim(self):return self.drawVars['dim'].get()def getProj(self):return self.drawVars['proj'].get()def getDct(self):return {key:self.drawVars[key].get() for key in self.drawVars}相关文章:
Python绘图系统25:新增8种绘图函数
文章目录 常用绘图函数单选框的更改逻辑源代码 Python绘图系统: 前置源码: Python打造动态绘图系统📈一 三维绘图系统 📈二 多图绘制系统📈三 坐 标 轴 定 制📈四 定制绘图风格 📈五 数据生成导…...
(二) gitblit用户使用教程
(一)gitblit安装教程 (二) gitblit用户使用教程 (三) gitblit管理员手册 目录 网页访问git客户端设置推送错误配置查看当前配置 日常使用仓库分组my profile修改上传代码简洁 网页访问 点击Advanced... 点击Accept the Risk and Contiue 初始用户名和密码都是admin,点击login…...
8.3Jmeter使用json提取器提取数组值并循环(循环控制器)遍历使用
Jmeter使用json提取器提取数组值并循环遍历使用 响应返回值例如: {"code":0,"data":{"totalCount":11,"pageSize":100,"totalPage":1,"currPage":1,"list":[{"structuredId":&q…...
SNERT预备队招新CTF体验赛-Misc(SWCTF)
目录 1、最简单的隐写 2、旋转我 3、is_here 4、zip伪加密 5、压缩包密码爆破 6、我就藏在照片里 7、所以我放弃了bk 8、套娃 9、来自银河的信号 10、Track_Me 11、勇师傅的奇思妙想 1、最简单的隐写 下载附件后,图片格式并不支持打开 根据题目提示&…...
MySql017——组合查询
一、UNION作用 可用UNION操作符来组合数条SQL查询。 二、UNION 使用规则 1、UNION的使用很简单。所需做的只是给出每条SELECT语句,在各条语句之间放上关键字UNION。2、UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔ÿ…...
【0224】源码分析RelFileNode对smgr访问磁盘表文件的重要性(2)
1. RelFileNode的角色 RelFileNode 是一个结构体数据类型,声明于relfilenode.h(src\include\storage )头文件中,该数据类型十分重要,因为它 “提供所有我们需要知道的物理访问关系表的信息。” smgr要访问磁盘上面的数据表文件,则需要此RelFileNode提供必要信息。 可以说…...
2310C++λ中完美转发
原文 C11里面就引入了完美转发概念,通过它,可按参数实际类型转发参数. 元<型名 T>空 处理(T&t){输出<<"左值\n";} 元<型名 T>空 处理(T&&t){输出<<"右值\n";} 元<型名 T>空 测试转发(T&&t){处理(前向&…...
【C++11】std::function 包装器(又叫适配器),std::bind 绑定
文章目录 std::function 包装器1. 使用方法2. 包装器的应用场景:题目 - - 逆波兰表达式求值3. 成员函数 和 static 静态成员函数 使用 包装器 std::bind 适配器绑定1. 使用方法2. 调整参数 顺序3. 指定参数 / 参数个数的调整 std::function 包装器 std::function 包…...
Linux系统编程系列之线程
一、什么是线程 线程(Thread)是计算机中的基本执行单元,是操作系统调度的最小单位。线程是进程内的一个独立执行流程,一个进程可以包含多个线程,这些线程共享进程的资源,但每个线程都有自己的独立栈空间以及…...
CV面试知识点总结
一.卷积操作和图像处理中的中值滤波操作有什么区别? 1.1卷积操作 卷积操作是一种线性操作,通常用于特征的提取,通过卷积核的加权求和来得到新的像素值。1.2中值滤波 原文: https://blog.csdn.net/weixin_51571728/article/detai…...
Centos一键安装、切换各版本JDK
查看服务中的安装的jdk rpm -qa | grep java获取jdk各版本信息 yum -y list java*查看指定版本 yum -y list java*|grep 1.8安装jdk yum install java-11-openjdk当服务器中有多个版本jdk,切换指定jdk版本 alternatives --config java按照提示输入编号即可切换&…...
JavaWeb项目:smbms(mysql)
1.准备工作,创建数据库 CREATE DATABASE smbms;USE smbms;CREATE TABLE smbms_address (id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 主键ID,contact VARCHAR(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 联系人姓名,addressDesc VARCHAR(50) COLLATE u…...
shell脚本的多线程介绍
shell脚本的多线程介绍 shell脚本中,实现多线程可以使用以下方法: 1)使用&符号 在Shell中,可以使用&符号将命令放在后台执行,这样就可以同时执行多个命令。例如: #!/bin/bash command1 & #…...
周记之反思
9.25 这篇总结我承认,是在26号上午写的,那昨天晚上又聊天了,但是对比之前来说好很多了,所以26号上午也就是今天我起了个大早,然后把昨天的尾巴收了一下,没收完,先说说成果: 完成了…...
信创办公–基于WPS的EXCEL最佳实践系列 (数据整理复制粘贴)
信创办公–基于WPS的EXCEL最佳实践系列 (数据整理复制粘贴) 目录 应用背景操作步骤1、数据查找与替换2、复制或粘贴数据3、使用自动填充工具4、将数据拆分到多列5、应用数字格式 应用背景 数据的整理复制粘贴等在日常的工作中经常使用。本章内容主要学习…...
二极管的直流等效电路和微变等效电路
二级管的主要参数 1.IF(最大整流的电流) 二极管长期工作做能够通过电流的平均最大值:物理意义:功率电流值。 2.UR 二极管最高反向工作电压 需要留有裕度,通常能达到一半的裕度;UR不能等于UBR。 3.IR 未击穿…...
Python无废话-基础知识字典Dictionary详讲
“字典Dictionary” 是一种无序、可变且可嵌套的数据类型,用于存储键值对。字典使用花括号{}来定义,并用逗号分隔键值对。本文对字典常使用方法,创建字典、添加字典、删除字典、如何获取字典做了知识归纳。 字典有以下几个特征: …...
ChatGPT多模态升级,支持图片和语音,体验如何?
一、前言 9 月 25 日,ChatGPT 多模态增加了新的语音功能和图像功能。这些功能提供了一种新的、更直观的界面,允许我们与 ChatGPT 进行语音对话或展示我们正在谈论的内容。 ChatGPT 现在可以看、听、和说话了,而不单单是一个文本驱动的工具了。…...
(SAR)Sentinel-1影像自动下载
基于ASF网站提供的python代码,实现Sentinel-1影像的自动下载; 1、登录ASF网站 登录Sentinel-1影像ASF网站:https://search.asf.alaska.edu/; 点击网站最右侧Sign in图标,进行用户注册; 注册完用户之后&…...
设计模式10、外观模式Facade
解释说明:外观模式(Facade Pattern)又称为门面模式,属于结构型模式 Faade 为子系统中的一组接口提供了一个统一的高层接口,该接口使得子系统更加容易使用 外观(Facade)角色:为多个子系统对外提供…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
