首页 > 其他分享 >Matplotlib库的基本使用

Matplotlib库的基本使用

时间:2024-10-22 21:36:15浏览次数:1  
标签:基本 plot plt import matplotlib ax2 Matplotlib 使用 inline

1. 什么是Matplotlib

  • Matplotlib是一款用于数据可视化的Python第三方库;
  • 它能够根据NumPy数组来绘制2D图像。

2. 绘图基础

Matplotlib库太大,画图通常只需要其中的核心模块:matplotlib.pyplot即可,并给一个别名,即:import matplotlib.pyplot as plt

2.1 绘制图像

import matplotlib.pyplot as plt

# 绘制图像
Fig1 = plt.figure()		# 创建新图窗
x = [1,2,3,4,5]			# 数据的x值
y = [1,8,27,64,125]		# 数据的y值
plt.plot(x,y)			# plot函数:先描点,再连线

我们可以让界面展示SVG高清矢量图:

import matplotlib.pyplot as plt

# 展示高清图
from matplotlib_inline import backend_inline
backend_inline.set_matplotlib_formats('svg')

# 绘制图像
Fig1 = plt.figure()		# 创建新图窗
x = [1,2,3,4,5]			# 数据的x值
y = [1,8,27,64,125]		# 数据的y值
plt.plot(x,y)			# plot函数:先描点,再连线

2.2 保存图像

保存图像用.savefig()方法,其需要一个r字符串:r'绝对路径\图像名.后缀'

  • 绝对路径:即从盘符开始的完整路径;
  • 后缀:可保存图形的格式很多,包括:eps、jpg、pdf、png、ps、svg等。

为了保存清晰的图,推荐保存至svg矢量格式:

Fig1.savefig(r'C:\Users\L\Desktop\我的图.svg')

保存为svg格式后,可直接拖至word或visio中,即可显式高清矢量图。

2.3 两种画图方式

Matplotlib中有两种画图方式:Matlab方式(推荐)和面向对象方式。

两种方式大部分情况下是一样的,且可以相互转化,个别情况有区别。

import matplotlib.pyplot as plt

# 展示高清图
from matplotlib_inline import backend_inline
backend_inline.set_matplotlib_formats('svg')

# 准备数据
x = [1,2,3,4,5] 
y = [1,8,27,64,125]

# Matlab方式
Fig1 = plt.figure()
plt.plot(x,y)

# 面向对象方式
Fig2 = plt.figure()
ax2 = plt.axes()
ax2.plot(x,y)

对于面向对象方式,其实就是先创建图窗,再创建坐标轴。

2.4 图窗与坐标轴

对于图窗:

​ 图像窗口(figure)在Matlab中会单独弹出,该窗口可容纳元素,也可以是空的窗口。在Jupyter中,可以不写plt.figure()也可以看到窗口,但这不是个好习惯。我们在画图前仍然要手动创建窗口,毕竟保存图形的.savefig()方法需要图形对象来调用

对于坐标轴:

​ 坐标轴(axes)是一个矩形,其下方是x轴的数值与刻度,左侧是y轴的数值与刻度。

3. 多图形的绘制

注意:我们经常使用Jupyter来画图,必须保证图形的图窗创建与画完必须在一个代码块中,不可以分成多个代码块。

3.1 绘制多线条

绘制多线条时,两种方式差别不大:

import matplotlib.pyplot as plt

# 展示高清图
from matplotlib_inline import backend_inline
backend_inline.set_matplotlib_formats('svg')

# 准备数据
x = [1,2,3,4,5] 
y1 =[1,2,3,4,5]
y2 = [0,0,0,0,0]
y3 = [-1,-2,-3,-4,-5]

# Matlab方式
Fig1 = plt.figure()
plt.plot(x,y1)
plt.plot(x,y2)
plt.plot(x,y3)

# 面向对象方式
Fig2 = plt.figure()
ax2 = plt.axes()
ax2.plot(x,y1)
ax2.plot(x,y2)  
ax2.plot(x,y3)

3.2 绘制多子图

绘制多个子图时,两种方法差别比较大:

import matplotlib.pyplot as plt

# 展示高清图
from matplotlib_inline import backend_inline
backend_inline.set_matplotlib_formats('svg')

# 准备数据
x = [1,2,3,4,5] 
y1 =[1,2,3,4,5]
y2 = [0,0,0,0,0]
y3 = [-1,-2,-3,-4,-5]

# Matlab方式
Fig1 = plt.figure()
plt.subplot(3, 1, 1), plt.plot(x,y1)	# 表示3个子图按照3行1列方式排,该图是第一个 
plt.subplot(3, 1, 2), plt.plot(x,y2)	# 表示3个子图按照3行1列方式排,该图是第二个 
plt.subplot(3, 1, 3), plt.plot(x,y3)

# 面向对象方式
Fig2, ax2 = plt.subplots(3)
ax2[0].plot(x,y1)
ax2[1].plot(x,y2)
ax2[2].plot(x,y3)

对于面向对象的方式我们发现Fig2, ax2 = plt.subplots(3)代替了之前的两行代码,所以我们得出结论:以后用面向对象的方式创建图形时,可以直接写Fig2, ax2 = plt.subplots()

4. 图表类型

4.1 图表类型

plt提供5类基本图表,分别是:二维图(重点)、网格图(重点)、统计图(重点)、轮廓图(用不到)、三维图。

可以查看官方:Pairwise data — Matplotlib 3.9.2 documentation

二维图:只需要两个向量即可绘图,其中线型图可以替代其它所有二维图。

网格图:只需要一个矩阵即可绘图。

统计图:一般做数据分析时使用。

如果需要更多图,可以去官方查看挑选:Examples — Matplotlib 3.9.2 documentation

教程:Tutorials — Matplotlib 3.9.2 documentation

4.2 二维图

只讲解plot线型图函数,其它所有二维图都可用它替代。

4.2.1 设置颜色

plot()函数含color参数,可以设置线条的颜色。

import matplotlib.pyplot as plt

# 展示高清图
from matplotlib_inline import backend_inline
backend_inline.set_matplotlib_formats('svg')

# 准备数据
x = [1,2,3,4,5] 
y1 =[1,2,3,4,5]
y2 = [0,0,0,0,0]
y3 = [-1,-2,-3,-4,-5]

# Matlab方式和面向对象方式无差别
Fig1 = plt.figure()
plt.plot(x, y1, color='#7CB5EC')
plt.plot(x, y2, color='#F7A35C')
plt.plot(x, y3, color='#A2A2D0')
plt.plot(x, y4, color='#F6675D')
plt.plot(x, y5, color='#47ADC7')
 # 面向对象方式
Fig2, ax2 = plt.subplots()
ax2.plot(x, y1, color='#7CB5EC')
ax2.plot(x, y2, color='#F7A35C')
ax2.plot(x, y3, color='#A2A2D0')
ax2.plot(x, y4, color='#F6675D')
ax2.plot(x, y5, color='#47ADC7')

颜色是以十六进制存储的。

4.2.2 设置风格

plot()函数含有linestyle参数,可以设置线条的风格。

import matplotlib.pyplot as plt

# 展示高清图
from matplotlib_inline import backend_inline
backend_inline.set_matplotlib_formats('svg')

# 准备数据
x = [1,2,3,4,5] 
y1 =[1,2,3,4,5]
y2 = [0,0,0,0,0]
y3 = [-1,-2,-3,-4,-5]

# Matlab方式和面向对象方式无差别
Fig1 = plt.figure()
plt.plot(x, y1, linestyle='-')
plt.plot(x, y2, linestyle='--')
plt.plot(x, y3, linestyle='-.')
plt.plot(x, y4, linestyle=':')
plt.plot(x, y5, linestyle=' ')		# 注意这里有个隐藏线段,很有用,不要忽视

4.2.3 设置粗细

plot()函数含有linewidth参数,可以设置线条的粗细。

import matplotlib.pyplot as plt

# 展示高清图
from matplotlib_inline import backend_inline
backend_inline.set_matplotlib_formats('svg')

# 准备数据
x = [1,2,3,4,5] 
y1 =[1,2,3,4,5]
y2 = [0,0,0,0,0]
y3 = [-1,-2,-3,-4,-5]

# Matlab方式和面向对象方式无差别
Fig1 = plt.figure()
plt.plot(x, y1, linewidth=0.5)
plt.plot(x, y2, linewidth=1)
plt.plot(x, y3, linewidth=1.5)
plt.plot(x, y4, linewidth=2)

在设置线条粗细时,数字表示磅数,一般以0.5到3为宜。

4.2.4 设置标记

plot()函数含有marker参数,可以设置线条标记。

import matplotlib.pyplot as plt

# 展示高清图
from matplotlib_inline import backend_inline
backend_inline.set_matplotlib_formats('svg')

# 准备数据
x = [1,2,3,4,5] 
y1 =[1,2,3,4,5]
y2 = [0,0,0,0,0]
y3 = [-1,-2,-3,-4,-5]

# Matlab方式和面向对象方式无差别
Fig1 = plt.figure()
plt.plot(x, y1, marker='.')
plt.plot(x, y2, marker='o')
plt.plot(x, y3, marker='^')
plt.plot(x, y4, marker='s')
plt.plot(x, y5, marker='D')

标记可以调整吃寸,用markersize参数调整,其值以3到9为宜。

4.2.5 综合应用

import matplotlib.pyplot as plt

# 展示高清图
from matplotlib_inline import backend_inline
backend_inline.set_matplotlib_formats('svg')

# 准备数据
x = [1,2,3,4,5] 
y1 =[1,2,3,4,5]
y2 = [0,0,0,0,0]
y3 = [-1,-2,-3,-4,-5]

# Matlab方式和面向对象方式无差别
Fig1 = plt.figure()
plt.plot(x, y1, color='#7CB5EC', linestyle='-', linewidth=2, marker='o', markersize=6)
plt.plot(x, y2, color='#F7A35C', linestyle='--', linewidth=2, marker='^', markersize=6)
plt.plot(x, y3, color='#A2A2D0', linestyle='-.', linewidth=2, marker='s', markersize=6)
plt.plot(x, y4, color='#F6675D', linestyle=':', linewidth=2, marker='D', markersize=6)
plt.plot(x, y5, color='#47ADC7', linestyle=' ', linewidth=2, marker='o', markersize=6)

请注意y5的线条,此时为散点图,这种方式的散点图比plt.scatter()效率更高,更推荐。

4.3 网格图

只演示imshow函数,别的基本不用。

注意:面向对象的方式创建网格图会少很多功能,所以建议使用Matlab方式创建。

import matplotlib.pyplot as plt

# 展示高清图
from matplotlib_inline import backend_inline
backend_inline.set_matplotlib_formats('svg')

# 准备数据
import numpy as np
x = np.linspace(0,10,1000)
I = np.sin(x) * np.cos(x).reshape(-1,1)

 # Matlab 方式
Fig1 = plt.figure()
plt.imshow(I)

在网格图中还可以配置颜色条,使用plt.colorbar()

Fig1 = plt.figure()
plt.imshow(I)
plt.colorbar()

4.4 统计图

只演示直方图hist函数,因为其它函数主要出现在数据分析领域。

直方图和条形图的区别:

  • 条形图:可以用plot替代,主要说的是某一种特征不同情况下的数量多少,看不出平均值和标准差;
  • 直方图:统计学函数图,只为了看清某分布的均值和标准差。
import matplotlib.pyplot as plt

# 展示高清图
from matplotlib_inline import backend_inline
backend_inline.set_matplotlib_formats('svg')

 # 创建 10000 个标准正态分布的样本
import numpy as np
data = np.random.randn( 10000 )

# Matlab方式
Fig1 = plt.figure()
plt.hist( data )
# 面向对象方式
Fig2, ax2 = plt.subplots()
ax2.hist( data )

对该直方图求积分,结果就是个体的总数:10000。

4.4.1 区间个数

bins参数即区间划分的数量,默认为10。

# Matlab 方式
Fig1 = plt.figure()
plt.hist( data, bins = 30 )
 # 面向对象方式
Fig2, ax2 = plt.subplots()
ax2.hist( data, bins = 30 )

4.4.2 透明度

Alpha参数表示透明度,默认为1。

 # Matlab 方式
Fig1 = plt.figure()
plt.hist( data, alpha=0.5 )
 # 面向对象方式
Fig2, ax2 = plt.subplots()
ax2.hist( data, alpha=0.5 )

4.4.3 图表类型

histtype表示类型,默认为'bar'。可以将其改为'stepfilled',图形就没有夹缝了,像一体的一样。

# Matlab 方式
Fig1 = plt.figure()
plt.hist( data, histtype='stepfilled')
 # 面向对象方式
Fig2, ax2 = plt.subplots()
ax2.hist( data, histtype='stepfilled' )

4.4.4 直方图颜色

color表示直方图颜色。

 # Matlab 方式
Fig1 = plt.figure()
plt.hist( data, color='#A2A2D0' )
 # 面向对象方式
Fig2, ax2 = plt.subplots()
ax2.hist( data, color='#A2A2D0' )

4.4.5 边缘颜色

edgecolor表示直方图边缘的颜色。

 # Matlab 方式
Fig1 = plt.figure()
plt.hist( data, edgecolor='#FFFFFF )
 # 面向对象方式
Fig2, ax2 = plt.subplots()
ax2.hist( data, edgecolor='#FFFFFF' )

4.4.6 综合应用

import matplotlib.pyplot as plt

# 展示高清图
from matplotlib_inline import backend_inline
backend_inline.set_matplotlib_formats('svg')

 # 创建三个正态分布的样本
import numpy as np
x1 = np.random.normal( 3, 1, 1000 )
x2 = np.random.normal( 6, 1, 1000 )
x3 = np.random.normal( 9, 1, 1000 )

 # Matlab 方式
Fig1 = plt.figure()
plt.hist( x1, bins=30, alpha=0.5, color='#7CB5EC', edgecolor='#FFFFFF' )
plt.hist( x2, bins=30, alpha=0.5, color='#A2A2D0', edgecolor='#FFFFFF' )
plt.hist( x3, bins=30, alpha=0.5, color='#47ADC7', edgecolor='#FFFFFF' )

 # 面向对象方式
Fig2, ax2 = plt.subplots()
ax2.hist( x1, bins=30, alpha=0.5, histtype='stepfilled', color='#7CB5EC' )
ax2.hist( x2, bins=30, alpha=0.5, histtype='stepfilled', color='#A2A2D0' )
ax2.hist( x3, bins=30, alpha=0.5, histtype='stepfilled', color='#47ADC7' )

5. 图窗属性

5.1 坐标轴上下限

尽管Matplotlib会自动调整图窗为最佳的坐标轴上下限,但有时候我们需要自己设置。

import matplotlib.pyplot as plt

# 展示高清图
from matplotlib_inline import backend_inline
backend_inline.set_matplotlib_formats('svg')

# 准备数据
x = [ 1, 2, 3, 4, 5 ] # 数据的 x 值
y = [ 1, 8, 27, 64, 125 ] # 数据的 y 值

有两种方法设置坐标轴上下限:limaxis

5.1.1 lim

使用lim时,Matlab方式和面向对象方式出现区别:

  • Matlab:plt.xlim(x下限, x上限)plt.ylim(y下限, y上限)
  • 面向对象:ax.set_xlim(x下限, x上限)ax.set_ylim(y下限, y上限)
 # Matlab 方式(lim 法)
Fig1 = plt.figure()
plt.plot(x,y)
plt.xlim(1,5)
plt.ylim(1,125)
# 面向对象方式(lim 法)
Fig2, ax2 = plt.subplots()
ax2.plot(x,y)
ax2.set_xlim(1,5)
ax2.set_ylim(1,125)

5.1.2 axis

  • .axis([x下限, x上限, y下限, y上限])
# Matlab 方式(axis 法)
Fig5 = plt.figure()
plt.plot(x,y)
plt.axis([1, 5, 1, 125])
 # 面向对象方式(axis 法)
Fig6, ax6 = plt.subplots()
ax6.plot(x,y)
ax4.axis([1, 5, 1, 125])

还可以使用plt.axis('equal')使x轴与y轴的比例达到1:1等长。

5.2 标题与轴名

此处,两种创建方式又出现区别:

import matplotlib.pyplot as plt

# 展示高清图
from matplotlib_inline import backend_inline
backend_inline.set_matplotlib_formats('svg')

# 准备数据
x = [ 1, 2, 3, 4, 5 ] # 数据的 x 值
y = [ 1, 8, 27, 64, 125 ] # 数据的 y 值

 # Matlab 方式
Fig1 = plt.figure()
plt.plot(x,y)
plt.title('This is the title.')
plt.xlabel('This is the xlabel')
plt.ylabel('This is the ylabel')

 # 面向对象方式
Fig2, ax2 = plt.subplots()
ax2.plot(x,y)
ax2.set_title('This is the title.')
ax2.set_xlabel('This is the xlabel')
ax2.set_ylabel('This is the ylabel')

5.3 创建方式的区别

面向对象的方式和Matlab的方式有5种区别:

  • ax.set_xlim()对应plt.xlim()
  • ax.set_ylim()对应plt.ylim()
  • ax.set_title()对应plt.title()
  • ax.set_xlabel()对应plt.xlabel()
  • ax.set_ylabel()对应plt.ylabel()

为了统一,面向对象整合了这5个函数,结合成了一个,即:ax.set(xlim=(), ylim=(), title='', xlabel='', ylabel='')

5.4 图例

.legend()函数表示图例,一般图例会出现在二维图和统计图中,网格图则用颜色条代替图例。

import matplotlib.pyplot as plt

# 展示高清图
from matplotlib_inline import backend_inline
backend_inline.set_matplotlib_formats('svg')

 # 准备数据
x = [ 1, 2, 3, 4, 5 ] # 数据的 x 值
y1 = [ 1, 2, 3, 4, 5 ] # 数据的 y1 值
y2 = [ 0, 0, 0, 0, 0 ] # 数据的 y2 值
y3 = [ -1, -2, -3, -4, -5 ] # 数据的 y3 值

 # Matlab 方式
Fig1 = plt.figure()
plt.plot(x, y1, label='y=x')
plt.plot(x, y2, label='y=0')
plt.plot(x, y3, label='y=-x')
plt.legend()

 # 面向对象方式
Fig2, ax2 = plt.subplots()
ax2.plot(x ,y1, label='y=x')
ax2.plot(x ,y2, label='y=0')
ax2.plot(x ,y3, label='y=-x')
ax2.legend()

若有些线条的图例你不想展示,去掉函数中的label关键字即可。

legend还有三个常用的关键字参数:locframeonncol

  • loc用于表示图例位置,它的值分为两个位置值,一个在uppercenterlower中任选一个,一个在leftcenterright中任选一个,如:loc = 'upper right'表示图例显示在右上角。
    • 也可以用loc = 'best',会自动给你配置到最佳位置。
  • framon用于表示图例边框,不需要边框用:frameon = False
  • ncol用于表示图例的列数,默认是1列。

5.5 网格

.grid()表示网格,可以给图形加网格。

import matplotlib.pyplot as plt

# 展示高清图
from matplotlib_inline import backend_inline
backend_inline.set_matplotlib_formats('svg')

 # 准备数据
x = [ 1, 2, 3, 4, 5 ] # 数据的 x 值
y = [ 1, 8, 27, 64, 125 ] # 数据的 y 值

 # Matlab 方式
Fig1 = plt.figure()
plt.plot(x, y)
plt.grid()

网格也有美化,有两个参数color和linestyle,与plot里的用法一模一样。

标签:基本,plot,plt,import,matplotlib,ax2,Matplotlib,使用,inline
From: https://www.cnblogs.com/-ula/p/18493761

相关文章

  • maven的安装与使用
    一、安装下载地址:https://archive.apache.org/dist/maven/maven-3/3.5.2/binaries/二、配置环境变量1、配置MAVEN_HOME2、配置path环境变量3、用cmd命令查看有没有配置成功mvn-v4、修改settings.xml配置文件,配置本地仓库,添加阿里云镜像把下面代码添加到mirrors标签......
  • git hooks工具Yorkie 使用教程
    以下是使用Yorkie的详细教程,包括如何在npmpostinstall中自动运行npxyorkie。使用Yorkie的步骤1.安装Yorkie首先,在你的项目中安装Yorkie:npminstall--save-devyorkie2.配置package.json在package.json中添加hooks配置和postinstall脚本。你的package......
  • MQTTnet 4.3.7.1207 (最新版)使用体验,做成在线客服聊天功能,实现Cefsharp的物联的功能(如
    一、MQTTnet4.3.x版本客户端将客户端集成到cefsharp定制浏览器中,实现物联网功能网上很多代码是3.x版本代码,和4.x版本差异性较大,介绍较为简单或不系统二、部分代码说明初始化,初始化》连接服务端》发布上线信息(遗嘱)ConnectAsync等订阅主题:SubscribeAsync......
  • 手写节流函数-基本实现
    <buttonclass="btn">按钮</button><!--<scriptsrc="./js/underscore.js"></script>--><script>functionhdcthrottle(fn,time){//获取开始时间letstartTime=0const_throttleFn=f......
  • 队列以及循环队列及其基本操作
    和栈相反,队列是一种先进先出的数据结构,他在表尾插入元素,表头删除元素。队列也分为链队列以及顺序队列两种,链队列动态分配空间,不用担心空间不足,顺序队列简单易懂,操作方便,但是空间利用率低,所以我们一般使用链式队列结构。链式队列对顺序队列进行初始化,顺序队列分配空间类似于......
  • 使用 acme.sh 生成免费 90 天的 SSL 泛域名证书
    使用acme.sh生成免费90天的SSL泛域名证书使用acme.sh生成免费90天的SSL泛域名证书原创西瓜皮codebox代码助手 2024年10月16日08:00英国听全文图片 acms.sh是Github上开源的一款SSL证书申请工具,该工具安装配置完成后可帮我们申请免费SSL证书,并通过......
  • 防抖函数-手写(基本实现)
    <button>按钮</button><inputtype="text"><!--本地引入:下载js文件并且本地引入--><!--<scriptsrc="./js/underscore.js"></script>--><script>/*自己实现函数需要做的事情......
  • 鸿蒙Flutter 实战:使用第三方插件
    鸿蒙Flutter实战:使用第三方插件在鸿蒙Flutter开发中,如果涉及到使用原生功能,就要使用插件。使用插件有两种方式,一种是自己编写原生ArkTS代码,在Dart侧调用。另外一种是使用第三方代码。方式一:编号原生ArkTS代码该方案可以使用PlatformView或者MethodChannel调用。Platf......
  • 使用 ArkTs 开发 Flutter 鸿蒙平台插件
    使用ArkTs开发Flutter鸿蒙平台插件本文讲述如何开发一个Flutter鸿蒙插件,如何实现Flutter与鸿蒙的混合开发,以及双端消息通信。Flutter侧,编写MethodChannelconstMethodChannel_methodChannel=MethodChannel('xxx.com/app');///获取tokenstaticFuture<dyna......
  • 使用 `com.google.gson` 库将 Java 对象转换为 JSON 字符串,并且确保 `data` 字段是 `M
    要使用com.google.gson库将Java对象转换为JSON字符串,并且确保data字段是Map<String,Object>类型的,你可以按照以下步骤编写一个示例代码。这个示例代码将创建一个包含data字段的Java对象,并将data字段初始化为一个Map<String,Object>,然后动态地向其中添加......