Matplotlib图形配置--自定义坐标刻度

文章目录

  • 自定义坐标刻度
    • 编程要求
    • 代码解释


自定义坐标刻度

虽然matplotlib默认的坐标轴定位器与格式生成器可以满足大部分需求,但是并非对每一幅图都合适。

主次要刻度
学习前最好先对matplotlib图形的对象层级有深入了解。

matplotlib的figure对象是一个盛放图形元素的包围盒。可以将每个matplotlib对象都看成是子对象的容器,每个figure都包含axes对象,每个axes对象又包含其他表示图形内容的对象,比如xaxis/yaxis,每个属性包含构成坐标轴的线条、刻度和标签的全部属性。

每一个坐标轴都有主次要刻度,主要刻度要比次要刻度更大更显著,而次要刻度往往更小。

import matplotlib.pyplot as plt
import numpy as np
ax = plt.axes(xscale='log', yscale='log')
plt.show()

可以看到主要刻度都显示为一个较大的刻度线和标签,而次要刻度都显示为一个较小的可读性,不显示标签。

隐藏刻度与标签
最常用的刻度/标签格式化操作可能就是隐藏刻度与标签了,可以通过plt.NullLocator()和plt.NullFormatter()实现。

示例如下:

ax = plt.axes()
ax.plot(np.random.rand(50))
ax.yaxis.set_major_locator(plt.NullLocator())
ax.xaxis.set_major_formatter(plt.NullFormatter())
plt.show()

这里x轴的标签隐藏了但是保留了刻度线,y轴的刻度和标签都隐藏了。有的图片中都不需要刻度线,比如下面这张包含人脸的图形:

fig, ax = plt.subplots(5, 5, figsize=(5, 5))
fig.subplots_adjust(hspace=0, wspace=0)

从scikit-learn获取一些人脸照片数据

from sklearn.datasets import fetch_olivetti_faces
faces = fetch_olivetti_faces().images
for i in range(5):for j in range(5):ax[i, j].xaxis.set_major_locator(plt.NullLocator())ax[i, j].yaxis.set_major_locator(plt.NullLocator())ax[i, j].imshow(faces[10 * i + j], cmap="bone")
plt.show()

花哨的刻度格式
matplotlib默认的刻度格式可以满足大部分的需求。虽然默认配置已经很不错了,但是有时候可能需要更多的功能,比如正弦曲线和余弦曲线。

默认情况下刻度为整数,如果将刻度与网格线画在π的倍数上图形会更加自然,可以通过设置一个multipleLocator来实现将刻度放在你提供的数值倍数上:

fig, ax = plt.subplots()
x = np.linspace(0, 3 * np.pi, 1000)
ax.plot(x, np.sin(x), lw=3, label='Sine')
ax.plot(x, np.cos(x), lw=3, label='Cosine')

设置网格、图例和坐标轴上下限

ax.grid(True)
ax.legend(frameon=False)
ax.axis('equal')
ax.set_xlim(0, 3 * np.pi)
ax.xaxis.set_major_locator(plt.MultipleLocator(np.pi / 2))
ax.xaxis.set_minor_locator(plt.MultipleLocator(np.pi / 4))
plt.show()

matplotlib还支持用数学符号来做刻度,在数学表达式两侧加上美元符号$,这样就可以方便地显示数学符号和数学公式。

可以用plt.FuncFormatter来实现,用一个自定义函数设置不同刻度标签的显示:

def format_func(value, tick_number):

找到π/2的倍数刻度

    N = int(np.round(2 * value / np.pi))if N == 0:return "0"elif N == 1:return r"$\pi/2$"elif N == 2:return r"$\pi$"elif N % 2 > 0:return r"${0}\pi/2$".format(N)else:return r"${0}\pi$".format(N // 2)
ax.xaxis.set_major_formatter(plt.FuncFormatter(format_func))

格式生成器与定位器
前面已经介绍了一些格式生成器和定位器,这里再用表格简单总结一些内置的格式生成器和定位器:

定位器 描述
NullLocator 无刻度
FixedLocator 刻度位置固定
IndexLocator 用索引作为定位器
LinearLocator 从min到max均匀分布刻度
LogLocator 从min 到max按对数分布刻度
MultipleLocator 刻度和范围都是基数的倍数
MaxNLocator 为最大刻度找到最优位置
AutoMinorLocator 次要刻度的定位器
格式生成器 描述
NullFormatter 刻度上无标签
IndexFormatter 将一组标签设置为字符串
FixedFormatter 手动为刻度设置标签
FuncFormatter 用自定义函数设置标签
FormatStrFormatter 为每个刻度值设置字符串格式
ScalarFormatter 为标量值设置标签
LogFormatter 对数坐标轴的默认格式生成器

编程要求

在右侧编辑器补充代码,根据file_path读取文件,统计不同二级类的数量做折线图并旋转x坐标轴90度,具体要求如下:

图形的figsize为(10, 10);

图形需保存到Task3/img/T1.png。

数据内容如下:
在这里插入图片描述

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
plt.rcParams['font.sans-serif']=['simhei']
plt.rcParams['font.family']='sans-serif'
plt.rcParams['axes.unicode_minus']=Falsedef student(file_path):# ********* Begin *********#plt.figure(figsize=(10,10))data=pd.read_csv(file_path)a=data.groupby(["二级类"])["二级类"].count()plt.plot(a)plt.xticks(rotation=90)plt.savefig("Task3/img/T1.png")plt.show()# ********* End *********#

代码解释

创建图形对象并设置大小:

plt.figure(figsize=(10,10))

这行代码初始化一个图形窗口,并设置其大小为10x10英寸。

读取CSV文件:

data=pd.read_csv(file_path)

使用pandas库的read_csv函数读取file_path指定的CSV文件,并将数据存储在data变量中。注意,这里变量名由file_name更改为file_path,这表示传入的参数应该是一个文件路径字符串。

数据分组统计:

a=data.groupby(["二级类"])["二级类"].count()

使用pandas的groupby函数对data中的数据按照“二级类”列进行分组,然后使用count函数计算每个“二级类”分组中的行数(即每个类别的数量)。结果存储在a变量中,这是一个Series对象,索引是“二级类”的唯一值,值是对应的计数。

绘制折线图:

plt.plot(a)

使用matplotlib的plot函数绘制a的折线图。由于a是一个Series对象,它的索引(即“二级类”的唯一值)将作为x轴的值,它的值(即每个类别的数量)将作为y轴的值。

设置x轴刻度标签的旋转角度:

plt.xticks(rotation=90)

这行代码设置x轴刻度标签的旋转角度为90度,通常用于当x轴标签较长或较多时,避免它们之间的重叠,使图表更易读。

保存图表:

plt.savefig("Task3/img/T1.png")

使用savefig函数将当前绘制的图表保存为PNG格式的图像文件,文件名为T1.png,保存在Task3/img/目录下。如果目录不存在,代码将会抛出异常。

显示图表:

plt.show()

最后,使用show函数在屏幕上显示图表。如果代码运行在一个支持图形用户界面的环境中,这将会弹出一个窗口来显示图表。


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

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

相关文章

Oracle集群ASM磁盘扩容

先通过lsblk来查看集群两端磁盘是否扩容成功 lsblk -a查看自己两边磁盘UUID是否相同(for i in 后面为磁盘sd后字母名) for i in x y z aa ab ac ad ae do echo "KERNEL\"sd*\", SUBSYSTEM\"block\", PROGRAM\"/lib/udev/scsi_id --whitelist…

Vue 3中的ref:响应式变量的强大工具

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

jeecgboot 开放页面权限,免登录访问

前端需要配置路由和添加白名单 1、配置路由 2、 在permission.js里,把刚才的路由添加到白名单 3、 后端需要把该页面涉及到的接口排除权限拦截 比如我这个页面涉及到两个接口: 那么就在后端的excludeUrls把这两个接口加进去。 前端后端都设置好了&…

PostgreSQL教程(二十九):服务器管理(十一)之高可用、负载均衡和复制

数据库服务器可以一起工作,这样如果主要的服务器失效则允许一个第二服务器快速接手它的任务(高可用性),或者可以允许多个计算机提供相同的数据(负载均衡)。理想情况下,数据库服务器能够无缝地一…

Linux系统运维脚本:检查登录用户是否过多 (比如超过20个),使用uptime,who,cron等命令查看登录用户的数量

目 录 一、问题 二、解决方法 1、通过统计登录用户来发现非法入侵者 2、脚本实现登录用户数超过阈值,给出提醒 3、定期运行脚本,让提醒及时有效 一、问题 Linux的服务器放在公网上,很多人需要访问这个服务器,知道…

AI皮肤测试的基本原理

人工智能测试皮肤的实现原理通常涉及计算机视觉和机器学习技术。以下是一般的实现步骤和原理,涉及数据收集、特征提取、模型训练和优化等多个步骤,利用这些步骤中的技术手段来实现对皮肤状况的识别和分类。北京木奇移动技术有限公司,专业的软…

在用Java写算法的时候如何加快读写速度

对于解决该方法我们一般如下操作,不需要知道为什么,有模板(个人观点) 使用BufferedReader代替Scanner:Scanner类在读取大量输入时性能较差,而BufferedReader具有更高的读取速度。可以使用BufferedReader的r…

车规芯片为什么需要信息安全(2)

目录 1.车规芯片的信息安全应该从什么地方考虑 1.1 芯片硬件安全防护能力 1.2 车规芯片的信息安全服务

Yolov8将.pt文件转换为tensorRt的.trt文件(模型部署)

我的环境 确保自己已经有cuda和cudnn的环境基础上进行。 cuda:11.7cudnn:适合cuda的版本Anaconda3 [python 3.10]TensorRt-8.6.1 安装TensorRt环境 查看自己的cuda环境,去官网下载适合的win版本。 官网地址 下载后解压,将解压后lib目录添加到环境变…

总结:Spring循环依赖详解与@Lazy注解使用详解

总结:Spring循环依赖详解与Lazy注解使用详解 一前提知识储备:1.Spring Bean生命周期机制(IOC)2.Spring依赖注入机制(DI)(1)Autowired注解标注属性set方法注入(2&#xff…

Altium Designer如何对走线模式进行切换

AD软件提供了比较智能的走线模式切换功能,可以根据个人习惯进行切换,能有效的提高了PCB设计效率。 点击界面右上角系统参数的图标 或者在pcb界面中使用快捷键OP进入到优选项界面,然后选中 PCB Editor-Interactive Routing,在布线…

【C++】面向过程与面向对象

文章目录 1. 面向过程与面向对象2. 类(class)类的作用域 3. 访问限定符封装 4. 类的实例化5. this指针 1. 面向过程与面向对象 C语言是面向过程(procedure-oriented)的语言,分析出求解问题的步骤,通过函数…

mmdetection如何计算准确率、召回率、F1值

1、训练 python tools/train.py configs/fcos/fcosrdweed3.py 2、测试 这一步要加–outresult.pkl,才能计算准确率和召回率 python tools/test.py configs/fcos/fcosrddweed3.py work_dirs/fcosrddweed3/epoch_300.pth --outresultfcos.pkl3、计算准确率和召回率…

LDA 关键词提取

目录 介绍 主题数确认 代码实现 普通关键词提取 TF-IDF,textRank 实现链接:gensim 实现 TF-IDF;textRank 关键词提取_gensim tfidf关键词-CSDN博客 它们是直接从文本中提取关键词,如果想基于一些潜在语义,可以用 L…

【MySQL】巧用 Max 函数将字段值作为字段输出

力扣题 1、题目地址 学生地理信息报告 2、模拟表 表:student Column NameTypenamevarcharcontinentvarchar 该表可能包含重复的行。该表的每一行表示学生的名字和他们来自的大陆。 3、要求 一所学校有来自亚洲、欧洲和美洲的学生。 编写解决方案实现对大洲…

表的连接【MySQL】

文章目录 什么是连接测试表内连接外连接左外连接右外连接全外连接 自然连接交叉连接参考资料 什么是连接 数据库的连接是指在数据库系统中,两个或多个数据表之间建立的关联关系,使它们可以进行数据的交互和操作。连接通常基于某种共同的字段或条件&…

力扣每日一题 猜数字游戏 阅读理解

Problem: 299. 猜数字游戏 思路 &#x1f468;‍&#x1f3eb; 灵神 复杂度 Code class Solution {public String getHint(String secret, String guess) {int a 0;int[] cntS new int[10];int[] cntG new int[10];for(int i 0; i < secret.length(); i){if(secre…

leetcode 226. 翻转二叉树 java解法

题目描述 给你一棵二叉树的根节点 root&#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 解题思路 翻转一棵二叉树意味着交换每个节点的左右子树。我们可以使用递归的方法&#xff0c;从根节点开始&#xff0c;对每个节点进行如下操作&#xff1a; 交换当前节点的左…

Vscode连接外部虚拟环境

如果vscode工程目录里面有一个超级大的虚拟环境文件夹&#xff0c;怎么说都不是一件优雅的事&#xff0c;因此我们希望这个虚拟环境在工程目录外部&#xff0c;我们开始&#xff1a; 1. 复制虚拟环境目录路径&#xff1a;E:\envs\test 2. 在vscode中打开文件夹&#xff0c;CT…

Python教程:一文弄懂Python字符串(很详细)

字符串是计算机编程中表示文本数据的一种数据类型。在Python和许多其他编程语言中&#xff0c;字符串是由字符序列组成的不可变序列&#xff0c;可以包含字母、数字、符号以及空格等字符。字符串通常用引号括起来表示&#xff0c;可以使用单引号&#xff08;&#xff09;、双引…