Python绘图系统24:绘图类型和坐标映射的关系

news2024/12/22 17:01:55

文章目录

    • 类别与轴数
    • 坐标类别对映射的影像
    • 绘图类别对坐标轴的影响
    • 源代码

Python绘图系统:

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

类别与轴数

DrawType是用于设置绘图类型的class,目前由4个部分组成,分别是绘图窗口、绘图类型、坐标映射以及绘图坐标。

其中,除了绘图窗口外,后面三个绘图属性是息息相关的。比如imshow函数就只能接收一个数组作为绘图数据,而plot既可以接受一个,也可以接受两个,当指定projection为3d的时候,还可以接受三个。换句话说,绘图坐标这个combobox中的内容,应该受到绘图类型以及坐标映射的调节。所以,首先为这两个Combobox添加事件。

wDct['type'].bind('<<ComboboxSelected>>', self.cbTypeChanged)
wDct['proj'].bind('<<ComboboxSelected>>', self.cbProjChanged)

其中type发生变化时,proj的可选项也要跟着发生变化。而proj的可选项发生变化后,dim也要跟着变化。

为了实现这种变化,需要把这几个combobox都变成全局变量,只需把所有的wDct变成self.wDct即可。

目前有三种绘图函数,分别是点线图、散点图和条形图,这三种图形均可在2d坐标、3d坐标和极坐标下绘制。而在不同坐标映射的情况下,不同绘图函数的坐标数如下表所示

2Dpolar3D
plotx[,y]x[,y]x,y[,z]
scatterx,yx,yx,y[,z]
barx,yx,yx,y[,z]

坐标类别对映射的影像

首先更改type对proj的影响

def cbTypeChanged(self, evt):
    t = self.drawVars['type'].get()
    p = self.drawVars['proj'].get()
    if t in ("点线图", "散点图", "条形图"):
        self.wDct['proj']['value'] =  ("None", "3d", "polar")
    
    projs = self.wDct['proj']['value']
    if p not in projs:
        self.drawVars['proj'].set(projs[0])        
    self.cbTypeChanged(None)

其中,p表示当前的坐标映射,如果在选定的新的坐标映射元组,不支持p,那么就重新选择。

绘图类别对坐标轴的影响

matplotlib种总共有30多种绘图函数,结合3种坐标映射,那么总共有90种组合,如果用字典来写,虽然直观,但行数太多了,所以一步一步来,先看坐标的映射类型,然后再对绘图类型进行分类定制。这部分代码比较长,但逻辑十分简单,与cbTypeChanged几乎是一个模子刻出来的。

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'] = ('xy')

def cbProjPolar(self, t):
    if t in ("点线图"):
        self.wDct['dim']['value'] = ('x', 'xy')
    elif t in ("散点图", "条形图"):
        self.wDct['dim']['value'] = ('xy')

def cbProj3d(self, t):
    if t in ("点线图", "散点图",  "条形图"):
        self.wDct['dim']['value'] = ('xy', 'xyz')

最后效果如下

在这里插入图片描述

源代码

最后,附上base.py修改之后的源代码。

import numpy as np
import tkinter as tk
import tkinter.ttk as ttk

class 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 frm

    def 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', '^', '&lt;', '&gt;', '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 v

    def 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 = func
        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 initWidgets(self, ws):
        if ws==None: ws = [5, 5, 5, 3]
        slctDct = {'type':("点线图", "散点图", "条形图"), 
            'proj': ("None", "3d", "polar"), 
            'dim' : ("x", "xy", "xyz", "tx", "txy", "txyz")}    # 绘图维度

        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", "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'] = ('xy')

    def cbProjPolar(self, t):
        if t in ("点线图"):
            self.wDct['dim']['value'] = ('x', 'xy')
        elif t in ("散点图", "条形图"):
            self.wDct['dim']['value'] = ('xy')

    def cbProj3d(self, t):
        if t in ("点线图", "散点图",  "条形图"):
            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}

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

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

相关文章

CV面试知识点总结

一.卷积操作和图像处理中的中值滤波操作有什么区别&#xff1f; 1.1卷积操作 卷积操作是一种线性操作&#xff0c;通常用于特征的提取&#xff0c;通过卷积核的加权求和来得到新的像素值。1.2中值滤波 原文&#xff1a; https://blog.csdn.net/weixin_51571728/article/detai…

英飞凌Tricore原理及应用介绍06_系统定时器(STM)模块详解

目录 1.概述2 STM外设基本介绍3. STM模块使用原理3.1 64位数据如何同步读取?3.2 比较寄存器的原理?1.概述 STM全称为System Timer即系统定时器模块,在英飞凌Tricore芯片中,每个单独的CPU操作系统中配备一个系统定时器,为其操作系统程序调度提供时钟基础,在整个大系统中,…

【day9.30】消息队列实现进程间通信

write.c linuxlinux:~/23062/930$ cat write.c #include<myhead.h>#define ERR_MSG(msg) do{\fprintf(stderr, "__%d__:", __LINE__); \perror(msg);\ }while(0)typedef struct {long msgtype; //消息类型char data[1024]; //消息正文 }Msg_s;#define SIZ…

Java单链表

链表的介绍&#xff1a; 1) 链表是以节点的方式来储存的&#xff0c;是链式存储结构 2&#xff09;每个节点包含data域和next域&#xff0c;next域指向下一个节点 3&#xff09;链表内存储的元素不一定连续 4&#xff09;链表分带头节点的链表和不带头节点的链表 ​​​​ …

[论文笔记]UNILM

引言 今天带来论文Unified Language Model Pre-training for Natural Language Understanding and Generation的笔记,论文标题是 统一预训练语言模型用于自然语言理解和生成。 本篇工作提出了一个新的统一预训练语言模型(Unifield pre-trained Language Model,UniLM),可以同…

中间件漏洞靶场复现

一、简介 1.tomcat弱口令复现 通过弱口令复现的靶场复现&#xff0c;进一步熟悉了burpsuite的使用&#xff0c;冰蝎的使用以及爆破和木马生成waf上传的技术。 登陆到页面&#xff0c;先使用burpsuite对登陆进行拦截抓包&#xff0c;对参数进行修改破解爆破出密码。接着使用冰蝎…

【新书推荐】人工智能的当下,测试团队如何敏捷转型 —— 无测试组织

文章目录 〇、引子一、什么是“无测试组织”&#xff1f;二、无测试组织适用于哪些场景&#xff1f;三、无测试组织还有哪些优势或特点&#xff1f;新书推荐 —— 《**无测试组织&#xff1a;测试团队的敏捷转型** 》 〇、引子 初次看到“无测试组织”的朋友可能会觉得有标题党…

picoctf_2018_can_you_gets_me

picoctf_2018_can_you_gets_me Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000)32位&#xff0c;只开了NX 拿到这么大的程序&#xff0c;直接ROPchain看看 #!/usr/bin/env python2# execve …

基于SpringBoot的校园点餐系统

基于SpringBoot的校园点餐系统的设计与实现&#xff0c;前后端分离 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 【主要功能】 角色&#xff1a;用户、管理员 用户前台&#xff1a;…

直播协议 python 常见直播协议

1. 推流、直播 和 点播分别是什么意思&#xff1f; 推流 主播将本地视频源和音频源推送到云服务器&#xff0c;也被称为“RTMP发布”。 直播 即直接观看主播实时推送过来的音视频数据。 点播 视频源已经事先存储于云服务器之上的音视频文件&#xff0c;观众随时可以观看。 目…

手机投屏到笔记本电脑小方法

1、我们可以开启Windows自带的投影功能&#xff0c;将我们的手机和电脑连接同一个无线网络。 2、在电脑开始菜单栏里找到设置选项并打开。 3、我们进入之后找到系统选项&#xff0c;点击进去之后找到点击投影到这台电脑&#xff0c;接下来我们将默认的始终关闭的下拉选项更改为…

【ShaderLab罪恶装备卡通角色_二次元风格_“Sol Badguy“_角色渲染(第二篇)】

罪恶装备背德之炎卡通角色_二次元风格_Unity 角色渲染 角色初始效果&#xff1a;基础渲染SimpleBas 资源分析模型顶点颜色&#xff1a; 贴图资源SOL_base_基础色块效果&#xff1a;其中SOL_base_A通道的效果&#xff1a; SOL_ilm&#xff1a;如下SOL_ilm模型上区域分布- 左到右…

【Axure】元件库和母版、常见的原型规范、静态原型页面制作

添加现有元件库 点击元件库——载入 当然也可以创建元件库&#xff0c;自己画自己保存 建立京东秒杀母版 静态原型页面的制作 框架 选择以iphone8的界面大小为例&#xff0c;顶部状态栏高度为20 左侧类似于标尺&#xff0c;因为图标、文字离最左侧的间距是不一样的 信…

开绕组电机零序Bakc EMF-based无感控制以及正交锁相环inverse Park-based

前言 最近看论文遇到了基于反Park变换的锁相环&#xff0c;用于从开绕组永磁同步电机零序电压信号中提取转子速度与位置信息&#xff0c;实现无感控制。在此记录 基于零序Back EMF的转子估算 开绕组电机的零序反电动势 e 0 − 3 ω e ψ 0 s i n 3 θ e e_0-3\omega_e\psi_…

C++-哈希Hash

本期我们来学习哈希 目录 unordered系列关联式容器 unordered_map unordered_set 性能比较 哈希概念 哈希冲突 哈希函数 哈希冲突解决 闭散列 模拟实现 开散列 模拟实现 全部代码 unordered系列关联式容器 在 C98 中&#xff0c; STL 提供了底层为红黑树结构的一…

知识图谱小白入门(1):neo4j的安装与CQL的使用

文章目录 序一、安装neo4j1.1 下载neo4j1.2 安装JDK1.3 BUG&#xff1a;dbms failed to start 二、CQL语法2.1 CQL语法2.2 习题 习题答案 序 知识图谱&#xff0c;是一种实体间的信息与关系知识的网状结构&#xff0c;借用图论中点与边的概念进行组建&#xff0c;易于结构化和…

生信教程:ABBA-BABA分析之滑动窗口

简介 ABBA BABA 统计&#xff08;也称为 D 统计&#xff09;为偏离严格的分叉进化历史提供了简单而有力的检验。因此&#xff0c;它们经常用于使用基因组规模的 SNP 数据测试基因渗入。 虽然最初开发用于基因渗入的全基因组测试&#xff0c;但它们也可以应用于较小的窗口&#…

Qt地铁智慧换乘系统浅学(四 )实现添加线路,添加站点,添加边 并且存储到本地txt文件

玩的就是添加 添加前的构思界面设计tabWidget添加线路界面添加站点界面添加边界面 代码实现添加线路思路连接槽函数槽函数 添加站点思路连接槽函数初始化combox槽函数更新容器函数 添加边思路槽函数 和代码 注意 添加前的构思 假设 现要添加一个线路 &#xff1a; 9号线 如果…

[H5动画制作系列 ]帧代码运行顺序测试

刚开始接触Animate CC&#xff08;过去叫&#xff1a;Flash&#xff09;,对于帧代码的执行顺序十分迷惑。所以,专门做一个简单代码顺序测试. 准备工作: 代码图层actions&#xff0c;第1帧和第10帧为关键帧。 背景图层bg&#xff0c;就一个字符串红色Test.界面如下: 代码测试步…

八个不可不知的SQL高级方法

结构化查询语言&#xff08;SQL&#xff09;是一种广泛使用的工具&#xff0c;用于管理和操作数据库。基本的SQL查询简单易学&#xff0c;但掌握高级SQL技术可以将您的数据分析和管理能力提升到新的高度。 高级SQL技术是指一系列功能和函数&#xff0c;使您能够对数据执行复杂…