绘图常用方法

在使用matplotlib进行绘图时有几种常用的方法:

pyplot绘图

第一种是最常见的,即通过调用pyplot的api去进行绘图。

matplotlib.pyplot (opens new window)是一组命令样式函数,使Matplotlib的工作方式类似于MATLAB。每个pylot函数对图形进行一些更改:例如,创建图形、在图形中创建绘图区域、在绘图区域中绘制一些线、使用标签装饰绘图等。
pyplot (opens new window)主要用于交互式绘图和编程绘图生成简单图例。

面向对象的API

Matplotlib的核心是面向对象的。如果需要对 plots 进行更多控制和自定义,我们建议直接使用对象。

在许多情况下,您将使用 pyplot.subplots创建一个 图形和一个或多个轴,然后处理这些对象。

这种方法是我们需要去掌握的,也是比较推荐使用的,即
fig, ax = plt.subplots(),指定figure和axes,然后对axes单独操作。

这种方式较pyplot的方式可以进行更细致的精调。

plt、fig、axes、axis的含义

下面步入正题:

plt

上面提到的第一种绘图的方法,通过调用pyplot的api进行绘图,plt是我们常在引入pyplot包时为其起的一个别名。

import matplotlib.pyplot as plt

figure,axes与axis

在这里插入图片描述
对于matplotlib中的一张图包含了以上标记的内容:

如果将Matplotlib绘图和我们平常画画相类比,可以把Figure想象成一张纸(一般被称之为画布),Axes代表的则是纸中的一片区域(当然可以有多个区域,这是后续要说到的subplots),下面是一张更形象一点的图:
在这里插入图片描述
在Figure画布中,Axes1区域画了一张数据仪表盘,Axes2区域画了柱状图,Axes3区域绘制了一张地图。

plt.plot()和ax.plot()有何区别,下面列出了两种用Matplotlib绘制图表的方式。

plt.figure()
plt.plot([1, 2, 3], [4, 5, 6])
plt.show()

# 第二种方式
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [4, 5, 6])
plt.show()

在这里插入图片描述
在这里插入图片描述
可以看出,两种方式产生的结果完全一样。从第一种方式的代码来看,先生成了一个Figure画布,然后在这个画布上隐式生成一个画图区域进行画图。
第二种方式同时生成了Figure和axes两个对象,然后用ax对象在其区域内进行绘图

如果从面向对象编程(对理解Matplotlib绘图很重要)的角度来看,显然第二种方式更加易于解释,生成的fig和ax分别对画布Figure和绘图区域Axes进行控制,第一种方式反而显得不是很直观,如果涉及到子图零部件的设置,第二种方式显然会更易于使用。

subplot绘制多个子图

首先要有一个画布Figure,其次,需要有两个区域Axes(等价于两个子图subplot)来画图

# 生成画布和axes对象
# nrows=1和ncols=2分别代表1行和2列
fig,ax = plt.subplots(nrows=1,ncols=2)

因为这里有两个画图区域,所以ax对应的是一个列表,存储了两个Axes对象。

然后对两个对象进行绘制

ax[0].plot([1,2,3],[4,5,6])
ax[1].scatter([1,2,3],[4,5,6])

在这里插入图片描述
可以看出,一个Axes对象对应了一个subplot子图,这些个子图都是画在同一个画布Figure之上。

经过上面可以区分fig与axes了,那么axis是什么呢?

axis是类似数轴的对象(最初的图中以绿色圈出)。他们负责设置图形限制并生成刻度(轴上的标记)和刻度标签(标记刻度的字符串)。刻度的位置由Locator对象确定,刻度 标签字符串的格式为Formatter。正确的组合Locator以及Formatter可以对刻度位置和标签进行非常精细的控制。

add_subplot与add_axes

首先add_subplot与add_axes都是面对象figure编程的,pyplot中没有此api。二者的区别如下:

add_subplot表示新增子图与subplots相似

import numpy as np
import matplotlib.pyplot as plt

# 新建figure
fig = plt.figure()
# 定义数据
x = [1, 2, 3, 4, 5, 6, 7]
y = [1, 2, 3, 4, 5, 6, 7]

# 新增子图1
ax1 = fig.add_subplot(1, 2, 1)
ax1.plot(x, y, 'r')
ax1.set_title('area1')

# 新增子图2
ax2 = fig.add_subplot(1, 2, 2)
ax2.plot(x, y, 'b')
ax2.set_title('area2')
plt.show()

在这里插入图片描述

add_axes表示新增子区域,该区域可以座落在figure内任意位置,且该区域可任意设置大小
add_axes参数可参考官方文档: http://matplotlib.org/api/_as_gen/matplotlib.figure.Figure.html#matplotlib.figure.Figure

import numpy as np
import matplotlib.pyplot as plt

#新建figure
fig = plt.figure()
# 定义数据
x = [1, 2, 3, 4, 5, 6, 7]
y = [1, 2, 3, 4, 5, 6, 7]
#新建区域ax1
#figure的百分比,从figure 10%的位置开始绘制, 宽高是figure的80%
left, bottom, width, height = 0.1, 0.1, 0.8, 0.8
# 获得绘制的句柄
ax1 = fig.add_axes([left, bottom, width, height])
ax1.plot(x, y, 'r')
ax1.set_title('area1')

#新增区域ax2,嵌套在ax1内
left, bottom, width, height = 0.2, 0.6, 0.25, 0.25
# 获得绘制的句柄
ax2 = fig.add_axes([left, bottom, width, height])
ax2.plot(x,y, 'b')
ax2.set_title('area2')
plt.show()

在这里插入图片描述

应用

有了上面的了解之后,那么我该怎么去绘制一个图形呢?
下面这个图中指出了每个部分的名称指南,这样想要修改某部分时可以明确要修改的内容的关键字。
在这里插入图片描述
具体绘制时:
1.首先创建画布

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(14,7))

在这里插入图片描述
2.我们在这个axes上画数据,因此就用ax.plot()来画

ax.plot([1,2,3],[4,5,6])

在这里插入图片描述
3.进行细节处理
设置xy轴标题,以及这个ax区域的标题

ax.set_title('Title',fontsize=18)
ax.set_xlabel('xlabel', fontsize=18,fontfamily = 'sans-serif',fontstyle='italic')
ax.set_ylabel('ylabel', fontsize='x-large',fontstyle='oblique')

对xy坐标轴进行设置

ax.set_aspect('equal')  # 设置轴缩放比例,y单位与x单位的比率。可设置'auto', 'equal'或者float值
ax.minorticks_on()  # 坐标轴显示小刻度
ax.set_xlim(0, 4)  # x轴的刻度范围[0,4]
ax.grid(None, which='minor', axis='y')  # 设置网格线
# which的可选值有[major, minor, both],major表示显示有刻度值处的网格线,minor表示显示没有刻度值处的网格线,both是所有刻度的网格线都显示
# axis的可选值有['both', 'x', 'y'],x表示仅显示竖直的网格线,y表示仅显示水平的网格线,both表示水平和竖直的网格线都显示

在这里插入图片描述
设置坐标轴tick和细节

start, end = ax.get_xlim()  # 得到x轴的刻度的范围
ax.xaxis.set_ticks(np.arange(start, end+1, 1))  # 设置坐标轴的显示的刻度值只有0,1,2,3,4
ax.xaxis.set_tick_params(rotation=45, labelsize=18, colors='r')  # 设置x轴刻度的标签的字号是18,倾斜角度为45度,颜色是红色
ax.yaxis.tick_right()  # 将y轴刻度和刻度标签(如果存在)移动到轴的右侧。

最后进行显示

plt.show()

在这里插入图片描述
完整代码:

import matplotlib.pyplot as plt
import numpy as np


fig, ax = plt.subplots()
ax.plot([1, 2, 3], [4, 5, 6])

ax.set_title('Title', fontsize=18)
ax.set_xlabel('xlabel', fontsize=18, fontfamily='sans-serif', fontstyle='italic')
ax.set_ylabel('ylabel', fontsize='x-large', fontstyle='oblique')

ax.set_aspect('equal')  # 设置轴缩放比例,y单位与x单位的比率。可设置'auto', 'equal'或者float值
ax.minorticks_on()  # 坐标轴显示小刻度
ax.set_xlim(0, 4)  # x轴的刻度范围[0,4]
ax.grid(None, which='minor', axis='y')  # 设置网格线
# which的可选值有[major, minor, both],major表示显示有刻度值处的网格线,minor表示显示没有刻度值处的网格线,both是所有刻度的网格线都显示
# axis的可选值有['both', 'x', 'y'],x表示仅显示竖直的网格线,y表示仅显示水平的网格线,both表示水平和竖直的网格线都显示


start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end+1, 1))  # 设置坐标轴的显示的刻度值只有0,1,2,3,4
ax.xaxis.set_tick_params(rotation=45, labelsize=18, colors='r')  # 设置x轴刻度的标签的字号是18,倾斜角度为45度,颜色是红色
ax.yaxis.tick_right()  # 将y轴刻度和刻度标签(如果存在)移动到轴的右侧。
plt.show()

参考链接:
https://zhuanlan.zhihu.com/p/93423829
https://jishuin.proginn.com/p/763bfbd23e20
https://matplotlib.org/1.5.1/faq/usage_faq.html#parts-of-a-figure

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐