目录
- 绘图常用方法
-
- pyplot绘图
- 面向对象的API
- plt、fig、axes、axis的含义
-
- plt
- figure,axes与axis
- add_subplot与add_axes
- 应用
绘图常用方法
在使用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 pltfig, 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 npfig, 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