当前位置: 首页 > news >正文

matplotlib入门之抛砖引玉

  • 1、基本概念
  • 2、新建一个简单的demo
  • 3、“美化”
  • 4、如何在一个Axes同时画多个曲线
  • 5、数据类型
  • 6、plt在jupyter和pycharm中使用的区别
  • 7、显示图片
    • 7.1 参数:X
    • 7.2 参数:cmap
    • 7.3 参数:norm

鉴于以往使用matplotlib都是百度来的,一旦自己上手就无能为力,所以这次简单入门一下matplotlib,搞清楚基本概念和基础用法。之所以又叫抛砖引玉是因为matplotlib比较太强,不可能总结的完,所以主要针对常用而进行的总结,如果能够基本了解,后面遇到更高要求百度一下函数的参数啊之类的,就可以制作更高端的效果。

1、基本概念

在使用matplotlib时需要了解figure和axes两个概念。figure就是一张画布,没有任何内容的画布。axes不好解释,它是轴axis的复数形式,意味着axes是一套坐标轴,一套坐标就包括了标题、轴名、样式等等。

所以我们画图都是先建一个figure,然后再建一个axes,然后在axes上绘制曲线、设置title、设置样式等(实际上很多代码都是直接plt.xxx开始画,这可以理解为高级API,都自动帮你处理了,但是遇到复杂一点的可能就没那么灵活了,所以建议还是按上面这种最佳实践方法来写)。
在这里插入图片描述

2、新建一个简单的demo

首先是构建figure和axes,一般有三种方式:

fig=plt.figure()  # 新建一个空figure,没有axes
fig,ax=plt.subplots()  # 新建一个有axes的figure

#新建一个有2*2个格子的axes的figure。比如这里fig就是整个图,而ax有4个子元素,每个元素代表一个格子让我们绘图
fig,ax1=plt.subplots(2,2)  

(plt.xxx简单但是不灵活,建议不要这么写)

比如在一个figure上划分两个Axes,一个画sin函数图,一个画cos函数图。

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(1, 2)	# 将Axes划分为1*2个格子

x = np.arange(0, 10, 0.1)
sin = np.sin(x)
cos = np.cos(x)

ax[0].plot(x, sin)  # 格子1绘制sin函数
ax[1].plot(x, cos)  # 格子2绘制cos函数

plt.show()  # 显式(在后面会介绍为什么要show)

在这里插入图片描述

3、“美化”

从2中我们绘制了一个图,但是信息太少了,什么title、style都没有。但是一个图有很多属性,比如轴、间距、标题等等,具体它们是指什么?设置他们的方法又是什么?
在这里插入图片描述
从上图我们就得到一些常用的诸如轴名、标题、图例等样式的设置。

总体来说可以分为两种,一种是针对Axes的,比如坐标轴需要设置标题、轴名、控制轴间距范围等等;另一种是针对图(也就是根据数据画的线条等)需要设置颜色、样式等等

针对Axes

# 比如
axes.Axes.set_xlim()和axes.Axes.set_ylim()  # 手动设置值域范围
axes.Axes.set_title()  # 标题
axes.Axes.set_xlabel()和axes.Axes.set_ylabel()  # 轴名
......

针对图
这部分主要是设置颜色、标记、线条样式等。

先看例子,下图是ax[1].plot(x, cos,'r-.v')的绘制效果,在这里'r-.v'就是规定了线条为红色+点划线+节点用倒三角表示,其实就是颜色字符+线型字符+标记字符的组合。
在这里插入图片描述

  • 颜色字符:‘b’ 蓝色,‘m’ 洋红色,‘g’ 绿色,‘y’ 黄色,‘r’ 红色,‘k’ 黑色,‘w’ 白色,‘c’ 青绿色,‘#008000’ RGB 颜色符串。多条曲线不指定颜色时,会自动选择不同颜色
  • 线型参数:‘‐’ 实线,‘‐‐’ 破折线,‘‐.’ 点划线,‘:’ 虚线
  • 标记字符:‘.’ 点标记,‘,’ 像素标记(极小点),‘o’ 实心圈标记,‘v’ 倒三角标记,‘^’ 上三角标记,‘>’ 右三角标记,‘<’ 左三角标记

注意线型参数和标记字符联合决定线条样式,如果都不指定则采用模型线条,如果只指定标记字符则不显式线型(也就是如果fmt指定为’o’,则图形只有节点没有连线,就成了散点图)

更多fmt以及复杂的属性设定:

  • Matplotlib 绘图标记
  • matplotlib.markers

综合上面针对Axes和图的“美化”,一个demo如下:

		import matplotlib.pyplot as plt
		import numpy as np
		
		fig, ax = plt.subplots(1, 2) # 创建一个带Axes的fig,并划分为两个格子
		
		x = np.arange(0, 10, 0.1)
		sin = np.sin(x)
		cos = np.cos(x)
		
		# ax[0] 表示格子1
		ax[0].plot(x, sin,'o')    # 表示为蓝色-实现-节点用实心圈表示
		ax[0].set_title("sin function")  # 设置标题
		ax[0].set_xlabel("x axis")  # 设置x轴名
		ax[0].set_ylabel("y axis")  # 设置y轴名
		
		ax[1].plot(x, cos,'r-.v')   # 表示为 红色-点划线--节点用倒三角表示
		ax[1].set_title("cos function")
		ax[1].set_xlabel("x axis")
		ax[1].set_ylabel("y axis")
		
		plt.show()

4、如何在一个Axes同时画多个曲线

简单,遵循一个函数:plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)
比如:

ax[0].plot(x, sin,'o',x,cos,'r-.v') # 依次画sin和cos函数图像

在这里插入图片描述
(实际上调用两次plot也行)

5、数据类型

上面说了这么多,那么能够plot的数据类型是什么?

  • ndarray
  • list(其实是自动转ndarray)

6、plt在jupyter和pycharm中使用的区别

经验发现,plt在jupyter和pycharm中使用有所不同,主要是显示方法上的不同。比如pycharm必须要加plt.show()才能正常显示。

这里主要是object-oriented interface和pyplot interface的区别:

  • OO interface:显式创建figure和axes,然后调用这些对象的方法
x = np.linspace(0, 2, 100)

# Note that even in the OO-style, we use `.pyplot.figure` to create the figure.
fig, ax = plt.subplots()  # Create a figure and an axes.
ax.plot(x, x, label='linear')  # Plot some data on the axes.
ax.plot(x, x**2, label='quadratic')  # Plot more data on the axes...
ax.plot(x, x**3, label='cubic')  # ... and some more.
ax.set_xlabel('x label')  # Add an x-label to the axes.
ax.set_ylabel('y label')  # Add a y-label to the axes.
ax.set_title("Simple Plot")  # Add a title to the axes.
ax.legend()  # Add a legend.
  • pyplot interface:靠pyplot自动创建和管理axes,然后使用pyplot函数画图。(所以很多plt都没有创建figure和axes也能运行)
x = np.linspace(0, 2, 100)

plt.plot(x, x, label='linear')  # Plot some data on the (implicit) axes.
plt.plot(x, x**2, label='quadratic')  # etc.
plt.plot(x, x**3, label='cubic')
plt.xlabel('x label')
plt.ylabel('y label')
plt.title("Simple Plot")
plt.legend()

正因为这些区别,pyplot interface通常用在交互式比如jupyter这种里面,而OO interface用在非交互式比如pycharm这种直接在函数里或代码里使用。

show()
在非交互式模式中,所有的行为都是delay的,要等show函数之后才执行。show函数能够被调用多次,等上一个窗口关闭后才显式下一张图片:

import numpy as np
import matplotlib.pyplot as plt

plt.ioff()
for i in range(3):
    plt.plot(np.random.rand(10))
    plt.show()

7、显示图片

上面都是在绘制曲线等使用,但是我们还可以使用plt来显示图片。

主要使用plt.imshow()来显示图像,参数如下:

plt.imshow(X,
           cmap=None,
           norm=None,
           ......
          )

7.1 参数:X

标量数据(意味着不能是tensor?),可以是RGB(A)的3D或4D数据,也可以是2D数据(默认伪彩色显示)。支持的数组形状包括: (W,H)、(W,H,3)、 (W,H,4)(通道后置)。

数据类型为0~1的浮点数或者0~255的整型数

注意伪彩色:对于2D的灰度图使用了cmap来控制显示色彩,如果直接显示,会显示伪彩色图的图像(默认cmap=“viridis”)。
在这里插入图片描述

对于RGB和RGBA则忽略cmap,正常显示。所以如果像显示灰度图则需要修改cmap='gray'或者cmap=plt.cm.gray
在这里插入图片描述

7.2 参数:cmap

在7.1中已经有所了解,plt中有很多种cmap,在color example code: colormaps_reference.py,并且你可以在Source code运行,会可视化出各种cmap样式,供你选择,图例代表最左侧值=0,最右侧值=1(或者uint8的255),所以你图中像素值接近0的就显示左侧的颜色,像素值接近1的就显示右侧的颜色
在这里插入图片描述

比如会灰度图像换上’bwr’(从图例看出越黑颜色越蓝,月亮颜色越红,中间亮度则越白)的cmap样式:
在这里插入图片描述

7.3 参数:norm

该参数用于在进行cmap颜色映射前,将输入data缩放到[0,1]之间。默认使用线性缩放:将最小值映射为0,最大值映射为1.

当然也可以指定比如’linear’,'log’等其他映射变换方式。

相关文章:

  • java-php-python-springboot携手助学助学交流平台计算机毕业设计
  • Android wifi sniffer log总结分析
  • 山东大学数字图像处理实验(二)
  • linux多个jdk时,java -version显示的版本有错误
  • 【论文笔记】An Image Patch is a Wave: Phase-Aware Vision MLP
  • 【前端升全栈】 五分钟了解Node.js
  • 部署若依springboot-vue前后端分离项目(Nginx反向代理 2022)
  • Kafka 优化问题
  • 【opencv-c++】windows10系统VisualStudio2022配置opencv_contrib-4.6.0
  • windows安装动力学仿真软件Frost并计算cassie机器人运动学和动力学
  • 使用 SolidJS 和 TypeScript 构建任务跟踪器
  • 【C++】list的模拟实现
  • 【Kotlin基础系列】第4章 类型
  • Vm虚拟机安装Linux系统教程
  • Java设计模式-单列模式
  • @angular/forms 源码解析之双向绑定
  • [笔记] php常见简单功能及函数
  • CSS实用技巧
  • jQuery(一)
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • SQLServer之索引简介
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • webpack入门学习手记(二)
  • 基于Android乐音识别(2)
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 前言-如何学习区块链
  • 思考 CSS 架构
  • 微信小程序--------语音识别(前端自己也能玩)
  • 《天龙八部3D》Unity技术方案揭秘
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​ssh免密码登录设置及问题总结
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • (13):Silverlight 2 数据与通信之WebRequest
  • (27)4.8 习题课
  • (4)(4.6) Triducer
  • (差分)胡桃爱原石
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET Framework杂记
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET企业级应用架构设计系列之开场白
  • // an array of int
  • @Autowired 与@Resource的区别
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...