Py学习  »  Python

实践教程|Python Matplotlib 绘图零基础教程

极市平台 • 3 年前 • 410 次点击  
↑ 点击蓝字 关注极市平台
作者丨笑傲算法江湖
来源丨笑傲算法江湖
编辑丨极市平台

极市导读

 

本文为零基础的Matplotlib使用教程,列举了一些图形的绘制方法。 >>加入极市CV技术交流群,走在计算机视觉的最前沿

Matplotlib 是 Python 的绘图库,可以用来绘制各种静态,动态,交互式的图表。其是一个非常强大的 Python 画图工具,可以绘制线图、散点图、等高线图、条形图、柱状图、3D 图形、甚至是图形动画等等。Matplotlib 通常与 NumPy 和 SciPy(Scientific Python)一起使用,是数据科学和机器学习工作者必不可少的工具。

这是一篇零基础Matplotlib使用教程,最好的学习方式是在实战中学习。

一、绘制基础知识

官方文档是最好的学习素材:
https://matplotlib.org/stable/tutorials/introductory/index.html

一些绘图基础知识:

  • 画板figure,画纸Subplot画质,可多图绘画
  • 画纸上最上方是标题title,用来给图形起名字
  • 坐标轴Axis,横轴叫x坐标轴xlabel,纵轴叫y坐标轴ylabel
  • 图例Legend描述图形里的内容
  • 网格Grid表示图形中的网格线,True代表显示
  • 点Markers表示点的形状

二、安装与导入

可以通过conda安装,终端命令如下:

conda install matplotlib  

通过import导入:

# 导入matplotlib的pyplot模块  
import matplotlib.pyplot as plt  

三、常用图形

基本的视觉元素有三种:点、线、柱状。

  • 对于数值类型,用点来进行可视化。例如想要知道学生为某科课程花费的时间和考试成绩两者之间的关系,可以把每个学生的数据绘制一个点,绘制出散点图 scatter plot,可以查看两者之间的相关性。
  • 对于时间序列的,用线条来进行可视化。用线条将相关的数据点连接在一起,帮助我们观察随着时间的变化数据的变化趋势,这样的图叫做折线图line plot
  • 对于分类数据,需要查看数据是如何在各个类别之间分布的,可以使用柱状图 bar plot
  • 用来表示第三个维度时,可以使用颜色。一般很难在二维平面上表示三维数据,这时可以使用颜色视觉元素。最典型是热图heatmap,通过用渐进颜色显示用户热衷的区域或所在地理区域的图。

四、对列表绘图的步骤

0、导入工具包

# 导入matplotlib的pyplot模块  
import matplotlib.pyplot as plt  
  
# mac操作系统加上下面这句,否则中文无法显示  
# plt.rcParams['font.sans-serif']=['Heiti TC']  

1、基础绘图

# 第1步:定义x和y坐标轴上的点   
# x坐标轴上点的数值  
x=[1,2,3,4]  
# y坐标轴上点的数值  
y=[1,4,9,16]  
  
# 第2步:使用plot给制线条  
# 第1个参数是x的坐标值  
# 第2个参数是y的坐标值  
plt.plot(x,y)  
  
# 第3步:显示图形   
plt.show()   

2、绘图设置

'''  
color:线条颜色,值r表示红色(red)  
marker:点的形状,值o表示点为圆圈标记(circle marker)  
linestyle:线条的形状,值dashed表示用虚线连接各点  
'
''  
plt.plot(x, y, color='r',marker='o',linestyle='dashed')  
# plt.plot(x, y, 'ro')  
'''  
axis:坐标轴范围  
语法为axis[xmin, xmax, ymin, ymax],  
也就是axis[x轴最小值, x轴最大值, y轴最小值, y轴最大值]  
'
''  
plt.axis([0, 6, 0, 20])  
plt.show()  

3、在图片上添加文本

# 第1步:定义x和y坐标轴上的点    
# x坐标轴上点的数值  
x=[1, 2, 3, 4]  
# y坐标轴上点的数值  
y=[1, 4, 9, 16]  
  
# 第2步:使用plot绘制线条   
# 第1个参数是x的坐标值  
# 第2个参数是y的坐标值  
plt.plot(x,y)  
# 添加文本 #x轴文本  
plt.xlabel('x坐标轴')  
# y轴文本  
plt.ylabel('y坐标轴')  
# 标题  
plt.title('标题')  
# 添加注释   
# 参数名xy:箭头注释中箭头所在位置  
# 参数名xytext:注释文本所在位置  
# arrowprops在xy和xytext之间绘制箭头   
# shrink表示注释点与注释文本之间的图标距离  
  
plt.annotate('我是注释', xy=(2,5), xytext=(2, 10),  
            arrowprops=dict(facecolor='black', shrink=0.01))  
  
#第3步:显示图形  
plt.show()  

五、绘制多个子图

如何使用Python创建多个画板和画纸来绘制多幅图,如果事先不声明画板画板,默认是创建一个画板一个画纸使用figure()方法创建画板1使用subplot()方法创建画纸,并选择当前画纸并绘图同样用subplot()方法选择画纸并绘图最后显示图形绘制多个图形。

subplot()方法里面传入的三个数字 前两个数字代表要生成几行几列的子图矩阵,第三个数字代表选中的子图位置。subplot(2,1,1)生成一个2行1列的子图矩阵,当前是第一个子图。

#创建画板1  
fig = plt.figure(1) #如果不传入参数默认画板1  
#第2步创建画纸,并选择画纸1  
ax1=plt.subplot(2,1,1)     
#在画纸1上绘图  
plt.plot([1, 2, 3])  
#选择画纸2  
ax2=plt.subplot(2,1,2)  
#在画纸2上绘图  
plt.plot([4, 5, 6])  
#显示图像  
plt.show()  

六、对数组的绘图

上面部分我们给图形传入的数据是list类型,但是如果绘制图形只允许传入列表的话,绘制图形会变得很麻烦。所以,我们一般传入的是numpy的数组 numpy.ndarray,实质上所有传入数据的类型在matplotlib内部处理时都会转化为numpy数组类型。

接下来看如何使用数组进行绘图,这里用一维数组来绘制多个折线图。

第一步,要导入numpy包,再用numpy的一维数组生成一个等差数组,用arange()方法。数组中的最小值为0,最大值为5,后一个数据比前一个大0.2。

# 多图绘制  
# 导入包numpy  
import numpy as np  
# 定义一维数组  
t = np.arange(0, 5, 0.2)  

第二步,定义三个折线图的坐标值,分别用x1,x2,x3表示三个坐标轴上x轴的数值,用y1,y2,y3表示y轴上的数值,这些坐标值都是一维数组。




    
# 使用数组同时绘制多个线性  
  
# 线条1  
x1=y1=t  
# 线条2  
x2=x1  
y2=t**2  
# 线条3  
x3=x1  
y3=t**3  

第三步,绘制出图形。

# 使用plot绘制线条  
linesList=plt.plot(x1, y1,    
         x2, y2,    
         x3, y3 )  
# 用setp方法可以同时设置多个线条的属性  
plt.setp(linesList, color='r')  
plt.show()  
print('返回的数据类型',type(linesList))  
print('数据大小:',len(linesList))  

公众号后台回复“极市直播”获取100+期极市技术直播回放+PPT

极市干货
技术干货损失函数技术总结及Pytorch使用示例深度学习有哪些trick?目标检测正负样本区分策略和平衡策略总结
实操教程 GPU多卡并行训练总结(以pytorch为例)CUDA WarpReduce 学习笔记卷积神经网络压缩方法总结

极市CVPR2023交流群已成立 #


△长按扫码进群
添加极市小助手微信(ID : cvmart4)

备注:姓名-学校/公司-研究方向-城市(如:小极-北大-目标检测-深圳)


即可申请加入极市目标检测/图像分割/工业检测/人脸/医学影像/3D/SLAM/自动驾驶/超分辨率/姿态估计/ReID/GAN/图像增强/OCR/视频理解等技术交流群


每月大咖直播分享、真实项目需求对接、求职内推、算法竞赛、干货资讯汇总、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企视觉开发者互动交流~

△点击卡片关注极市平台,获取 最新CV干货
点击阅读原文进入CV社区
收获更多技术干货

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/152546