matplotlib入门之抛砖引玉

鉴于以往使用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以及复杂的属性设定:

综合上面针对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’等其他映射变换方式。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是一个对称矩阵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值