摘要:Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用 ,Matplotlib也是深度学习的常用绘图库,主要是将训练的成果进行图形化,因为这样更直观,更方便发现训练中的问题。

本文分享自华为云社区《深度学习基础之matplotlib,一文搞定各个示例,建议收藏以后参考丨【百变AI秀】》,作者:香菜聊游戏。

Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用 ,Matplotlib也是深度学习的常用绘图库,主要是将训练的成果进行图形化,因为这样更直观,更方便发现训练中的问题,今天来学习下,走起!!

1、先来个demo 分析下

下面是一个典型的图形,我们如果想画这样一个图,应该做什么,应该准备哪些数据,这样的图形有哪些属性是你需要关注的?

1、怎么做一个图? 怎么创建一个画板?

2、怎么设置数据?x,y 的数据怎么放上去

3、设置图标示,左上角的各种线的颜色这种小窗体怎么画上去?

4、外观 ,不同线的颜色不同怎么处理?

5、怎么显示?

6、怎么保存?

这么多的问题,怎么搞?一步一步来,先给你看看代码,看下能明白多少

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()

2、matplotlib中的概念

下面这张图是官网的一张图,指明了很多概念,基本上常用的我们都能看到,看起来大部分也都能理解

Figure(容器)

整个图像称为Figure, Figure用于保存返回的Axes(坐标域), 一个Figure可以包含任意数量的Axes,可以理解为一个容器。

Axes(坐标域)

可以将它理解为一个单个画板, 一个Axes包含两个Axis(坐标轴)(在3D图中为三个Axis), 每个Axes都有 一个 title(方法: set_title()), 一个x-label(方法: set_xlabel()), 一个y-label(方法: set_ylabel()).注意:一个给出的Axes对象只能包含在一个Figure中。

Axis(坐标轴)

这是一种类似数轴的对象。可以通过Axis以及Axis的方法设置坐标轴上刻度的样式和坐标轴上的值。刻度的位置由Locater对象决定, 刻度对应的值由Formatter对象决定。

总结:Axes 差不多就是我们脑中所想的一个 ‘plot’。可以说就是单张纸。一个确定的figure当中可以有很多个Axes,但是一个确定的Axes只能在一个figure当中。

2维空间的Axes包含两个Axis(即x轴与y轴),3维空间的Axes包含三个Axis(即x轴,y轴和z轴)。这里注意区别Axes和Axis的概念

Axis是一个数轴对象,它主要用于设置一个Axes里面的数据约束(即两个端点的值)和轴上的ticks(就是轴上的标记刻度)和tick-labels刻度的标签。

Subplot:子图,figure对象下创建一个或多个subplot对象(即axes)用于绘制图像。

axes: 设置坐标轴边界和表面的颜色、坐标刻度值大小和网格的显示
figure: 控制dpi、边界颜色、图形大小、和子区( subplot)设置
font: 字体集(font family)、字体大小和样式设置
grid: 设置网格颜色和线性
legend: 设置图例和其中的文本的显示
line: 设置线条(颜色、线型、宽度等)和标记
patch: 是填充2D空间的图形对象,如多边形和圆。控制线宽、颜色和抗锯齿设置等。
savefig: 可以对保存的图形进行单独设置。例如,设置渲染的文件的背景为白色。
verbose: 设置matplotlib在执行期间信息输出,如silent、helpful、debug和debug-annoying。
xticks和yticks: 为x,y轴的主刻度和次刻度设置颜色、大小、方向,以及标签大小。

3、matplotlib 支持的图形

3.1 线图line

import matplotlib.pyplot as plt
import numpy as np# Data for plotting
t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2 * np.pi * t)fig, ax = plt.subplots()
ax.plot(t, s)ax.set(xlabel='time (s)', ylabel='voltage (mV)',title='About as simple as it gets, folks')
ax.grid()fig.savefig("test.png")
plt.show()

3.2 直方图hist

import numpy as np
import matplotlib.pyplot as pltnp.random.seed(19680801)# example data
mu = 100  # mean of distribution
sigma = 15  # standard deviation of distribution
x = mu + sigma * np.random.randn(437)num_bins = 50fig, ax = plt.subplots()# the histogram of the data
n, bins, patches = ax.hist(x, num_bins, density=True)# add a 'best fit' line
y = ((1 / (np.sqrt(2 * np.pi) * sigma)) *np.exp(-0.5 * (1 / sigma * (bins - mu))**2))
ax.plot(bins, y, '--')
ax.set_xlabel('Smarts')
ax.set_ylabel('Probability density')
ax.set_title(r'Histogram of IQ: $\mu=100$, $\sigma=15$')# Tweak spacing to prevent clipping of ylabel
fig.tight_layout()
plt.show()

3.3 路线

import matplotlib.path as mpath
import matplotlib.patches as mpatches
import matplotlib.pyplot as pltfig, ax = plt.subplots()Path = mpath.Path
path_data = [(Path.MOVETO, (1.58, -2.57)),(Path.CURVE4, (0.35, -1.1)),(Path.CURVE4, (-1.75, 2.0)),(Path.CURVE4, (0.375, 2.0)),(Path.LINETO, (0.85, 1.15)),(Path.CURVE4, (2.2, 3.2)),(Path.CURVE4, (3, 0.05)),(Path.CURVE4, (2.0, -0.5)),(Path.CLOSEPOLY, (1.58, -2.57)),]
codes, verts = zip(*path_data)
path = mpath.Path(verts, codes)
patch = mpatches.PathPatch(path, facecolor='r', alpha=0.5)
ax.add_patch(patch)# plot control points and connecting lines
x, y = zip(*path.vertices)
line, = ax.plot(x, y, 'go-')ax.grid()
ax.axis('equal')
plt.show()

3.4 散点图Scatter

3.5 极坐标图Polar plots

import numpy as np
import matplotlib.pyplot as plt
r = np.arange(0, 2, 0.01)
theta = 2 * np.pi * rfig, ax = plt.subplots(subplot_kw={'projection': 'polar'})
ax.plot(theta, r)
ax.set_rmax(2)
ax.set_rticks([0.5, 1, 1.5, 2])  # Less radial ticks
ax.set_rlabel_position(-22.5)  # Move radial labels away from plotted line
ax.grid(True)ax.set_title("A line plot on a polar axis", va='bottom')
plt.show()

3.6 饼图pie

import matplotlib.pyplot as plt# Pie chart, where the slices will be ordered and plotted counter-clockwise:
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]
explode = (0, 0.1, 0, 0)  # only "explode" the 2nd slice (i.e. 'Hogs')fig1, ax1 = plt.subplots()
ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',shadow=True, startangle=90)
ax1.axis('equal')  # Equal aspect ratio ensures that pie is drawn as a circle.plt.show()

3.7 3d 图形

import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LinearLocator
import numpy as npfig, ax = plt.subplots(subplot_kw={"projection": "3d"})# Make data.
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)# Plot the surface.
surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm,linewidth=0, antialiased=False)# Customize the z axis.
ax.set_zlim(-1.01, 1.01)
ax.zaxis.set_major_locator(LinearLocator(10))
# A StrMethodFormatter is used automatically
ax.zaxis.set_major_formatter('{x:.02f}')# Add a color bar which maps values to colors.
fig.colorbar(surf, shrink=0.5, aspect=5)plt.show()

#使用numpy产生数据
x=np.arange(-5,5,0.1)
y=x*3#创建窗口、子图
#方法1:先创建窗口,再创建子图。(一定绘制)
fig = plt.figure(num=1, figsize=(15, 8),dpi=80)     #开启一个窗口,同时设置大小,分辨率
ax1 = fig.add_subplot(2,1,1)  #通过fig添加子图,参数:行数,列数,第几个。
ax2 = fig.add_subplot(2,1,2)  #通过fig添加子图,参数:行数,列数,第几个。
print(fig,ax1,ax2)
#方法2:一次性创建窗口和多个子图。(空白不绘制)
fig,axarr = plt.subplots(4,1)  #开一个新窗口,并添加4个子图,返回子图数组
ax1 = axarr[0]    #通过子图数组获取一个子图
print(fig,ax1)
#方法3:一次性创建窗口和一个子图。(空白不绘制)
ax1 = plt.subplot(1,1,1,facecolor='white')      #开一个新窗口,创建1个子图。facecolor设置背景颜色
print(ax1)
#获取对窗口的引用,适用于上面三种方法
# fig = plt.gcf()   #获得当前figure
# fig=ax1.figure   #获得指定子图所属窗口# fig.subplots_adjust(left=0)                         #设置窗口左内边距为0,即左边留白为0。#设置子图的基本元素
ax1.set_title('python-drawing')            #设置图体,plt.title
ax1.set_xlabel('x-name')                    #设置x轴名称,plt.xlabel
ax1.set_ylabel('y-name')                    #设置y轴名称,plt.ylabel
plt.axis([-6,6,-10,10])                  #设置横纵坐标轴范围,这个在子图中被分解为下面两个函数
ax1.set_xlim(-5,5)                           #设置横轴范围,会覆盖上面的横坐标,plt.xlim
ax1.set_ylim(-10,10)                         #设置纵轴范围,会覆盖上面的纵坐标,plt.ylimxmajorLocator = MultipleLocator(2)   #定义横向主刻度标签的刻度差为2的倍数。就是隔几个刻度才显示一个标签文本
ymajorLocator = MultipleLocator(3)   #定义纵向主刻度标签的刻度差为3的倍数。就是隔几个刻度才显示一个标签文本ax1.xaxis.set_major_locator(xmajorLocator) #x轴 应用定义的横向主刻度格式。如果不应用将采用默认刻度格式
ax1.yaxis.set_major_locator(ymajorLocator) #y轴 应用定义的纵向主刻度格式。如果不应用将采用默认刻度格式ax1.xaxis.grid(True, which='major')      #x坐标轴的网格使用定义的主刻度格式
ax1.yaxis.grid(True, which='major')      #x坐标轴的网格使用定义的主刻度格式ax1.set_xticks([])     #去除坐标轴刻度
ax1.set_xticks((-5,-3,-1,1,3,5))  #设置坐标轴刻度
ax1.set_xticklabels(labels=['x1','x2','x3','x4','x5'],rotation=-30,fontsize='small')  #设置刻度的显示文本,rotation旋转角度,fontsize字体大小plot1=ax1.plot(x,y,marker='o',color='g',label='legend1')   #点图:marker图标
plot2=ax1.plot(x,y,linestyle='--',alpha=0.5,color='r',label='legend2')   #线图:linestyle线性,alpha透明度,color颜色,label图例文本ax1.legend(loc='upper left')            #显示图例,plt.legend()
ax1.text(2.8, 7, r'y=3*x')                #指定位置显示文字,plt.text()
ax1.annotate('important point', xy=(2, 6), xytext=(3, 1.5),  #添加标注,参数:注释文本、指向点、文字位置、箭头属性arrowprops=dict(facecolor='black', shrink=0.05),)
#显示网格。which参数的值为major(只绘制大刻度)、minor(只绘制小刻度)、both,默认值为major。axis为'x','y','both'
ax1.grid(b=True,which='major',axis='both',alpha= 0.5,color='skyblue',linestyle='--',linewidth=2)axes1 = plt.axes([.2, .3, .1, .1], facecolor='y')       #在当前窗口添加一个子图,rect=[左, 下, 宽, 高],是使用的绝对布局,不和以存在窗口挤占空间
axes1.plot(x,y)  #在子图上画图
plt.savefig('aa.jpg',dpi=400,bbox_inches='tight')   #savefig保存图片,dpi分辨率,bbox_inches子图周边白色空间的大小
plt.show()    #打开窗口,对于方法1创建在窗口一定绘制,对于方法2方法3创建的窗口,若坐标系全部空白,则不绘制

总结:

上面大部分的数据是总结自官方网站:https://matplotlib.org/stable/tutorials/introductory/usage.html#sphx-glr-tutorials-introductory-usage-py

如果上面有说的不准确的可以参考官方网站,还不能完全掌握,我也只能画画简单的图,能满足日常的需求罢了。

点击关注,第一时间了解华为云新鲜技术~

一文搞定Matplotlib 各个示例丨建议收藏相关推荐

  1. 一文搞定 Spring Data Redis 详解及实战

    转载自  一文搞定 Spring Data Redis 详解及实战 SDR - Spring Data Redis的简称. Spring Data Redis提供了从Spring应用程序轻松配置和访问 ...

  2. 一文搞定B站弹幕生成云图

    一文搞定B站弹幕生成云图 最近学了词云图, 感觉非常有趣,我们做一些图试试, 最近我们遭受了新冠疫情 , 关于这个点,去看看b站弹幕都在说什么? B站的弹幕接口 直接从B站某视频源中找半天没找到弹幕的 ...

  3. 【语义分割】综述——一文搞定语义分割

    本文记录了博主阅读的关于语义分割(Semantic Segmentation)的综述类文章的笔记,更新于2019.02.19. [语义分割]综述--一文搞定语义分割 参考文献网址 An overvie ...

  4. 一文搞定vim,从安装到入门到精通,助你成功入门vim

    一文搞定vim,从安装到入门到精通 NO.1 闲聊 NO.2 安装(不是重点!觉得这部分讲的不清楚可以去找一篇win下安装vim的文章来看,然后跳去NO.3接着看) NO3. 文章核心重点-vim使用 ...

  5. 一文搞定c++多线程

    一文搞定c++多线程 c++11引入了用于多线程操作的thread类,该库移植性更高,并且使得写多线程变得简洁了一些. 多线程头文件支持 为了支持多线程操作,c++11新标准引入了一些头文件来支持多线 ...

  6. php带参数单元测试_一文搞定单元测试核心概念

    基础概念 单元测试(unittesting),是指对软件中的最小可测试单元进行检查和验证,这里的最小可测试单元通常是指函数或者类.单元测试是即所谓的白盒测试,一般由开发人员负责测试,因为开发人员知道被 ...

  7. 【Python基础】一文搞定pandas的数据合并

    作者:来源于读者投稿 出品:Python数据之道 一文搞定pandas的数据合并 在实际处理数据业务需求中,我们经常会遇到这样的需求:将多个表连接起来再进行数据的处理和分析,类似SQL中的连接查询功能 ...

  8. 一文搞定Swing和Qt按钮和文本框的创建

    一文搞定Swing和Qt按钮和文本框的创建 Qt的截图 java的 源码 package com.lujun;import java.awt.Container;import javax.swing. ...

  9. 一文搞定C#关于NPOI类库的使用读写Excel以及io流文件的写出

    一文搞定C#关于NPOI类库的使用读写Excel以及io流文件的写出 今天我们使用NPOI类库读写xlsx文件, 最终实现的效果如图所示 从太平洋官网下载相应的类库,大概4~5MB,不要从github ...

最新文章

  1. Python 的种类以及特点
  2. 计算机领域经典巨著TAOCP卷3上市!【含赠书】
  3. xmlstreamexception 参数实体未进行声明_命名实体识别研究进展概述
  4. 深度学习(十六)——Faster R-CNN, YOLO
  5. Redis单机部署、添加开机自启、配置参数
  6. Linux 命令之 curl 的选项(英文版)
  7. 【ZOJ - 2836 】Number Puzzle (容斥原理)
  8. JFinal Db + Record模式 - ORM 框架
  9. gis怎么提取水系_SketchUp+Global Mapper 地形提取,连建模都省了...
  10. 魅族POP2s真无线耳机正式发布:售价299元!
  11. 知乎在线部分的技术架构
  12. Win10如何安装自带的XPS Viewer查看器
  13. 深度剖析5种最常见的指数估值算法
  14. 微软苏州面经:前两面简单,三面困难
  15. 在Excel里快速插入目录
  16. 丧心病狂的Github技巧
  17. 富途入金步骤记录(个人使用)
  18. [附源码]java毕业设计基于的旅游信息管理系统
  19. redis未授权访问
  20. Java+Uiautomator自动化测试 -- 3.实现手机的五种解锁方式(无/滑动/图案/PIN码/密码|)

热门文章

  1. (5)css样式表特征
  2. 牛客网 [编程题]餐馆
  3. 一:Tixiao Shan最新力作LVI-SAM(Lio-SAM+Vins-Mono),基于视觉-激光-惯导里程计的SLAM框架,环境搭建和跑通过程
  4. Python笔记(3) Python入门
  5. ROS笔记(7) 话题通信
  6. sql注入mysql判断_sql注入笔记二——数据库信息判断
  7. mysql不属于nosql_哪个数据库不属于nosql的范畴
  8. C#对象初始化的探讨
  9. 十一. Python基础(11)—补充: 作用域 装饰器
  10. es6 初级之箭头函数