在绘制图表的过程中,matplotlib会根据所绘图表的类型决定是否使用坐标系,或者显示哪种坐标系。其中,直角坐标系经常被使用。matplotlib中的直角坐标系由两条水平坐标轴、两条垂直坐标轴以及围成的绘图区域构成,以限制图形显示的区域,其左侧和下方的坐标轴(叫做y轴和x轴)经常被使用,其他坐标轴很少被使用。
坐标轴的结构相同,主要包括轴脊、刻度,其中刻度又可以细分为刻度线和刻度标签,刻度线又可以细分为主刻度线和次刻度线。坐标轴的各部分均是matplotlib类的对象:坐标轴是axis.Axis类的对象;轴脊是spines.Spine类的对象;刻度是axis.Ticker类的对象。此外,常用的x轴是一个axis.Xaxis类的对象,y轴是一个axis.Yaxis类的对象。如前所述的所有类的对象均包括于Axes类对象中,可通过Axes类的一些属性分别获取,关于这些属性的介绍如下:
- xaxis:获取x轴。
- yaxis:获取y轴。
- spines:获取包含全部轴脊的字典。
访问spines属性后会返回一个OrderedDict类的对象。OrderedDict类是dict的自类,它可以维护添加到字典中的键值对的顺序。
向任意位置添加坐标轴
matplotlib支持向画布的任意位置添加自定义大小的坐标系统, 同时显示坐标轴,而不再受规划区域的限制。pyplot模块可以使用axes()函数创建一个Axes类的对象,并将Axes类的对象添加到当前画布中。也可以使用Figure类对象的add_axes()方法在当前画布的任意位置添加Axes类对象。
axes()函数的语法格式如下:
axes(arg=None, projection=None, polar=False, aspect, frame_on, **kwargs)
该函数常用参数含义如下:
(1)参数arg支持None、4-tuple中任一取值,每种取值的含义如下:
- None:表示使用subplot(111)添加的与画布同等大小的Axes对象。
- 4-tuple:由4个浮点型元素(取值范围为0~1)组成的元组(left,bottom,width,height),前两个元素left和bottom分别表示坐标轴左侧和底部的边缘到画布的相对距离,用于确定坐标轴的位置;后两个元素width和height分别表示坐标轴的宽度和高度,用于确定坐标轴的相对大小。
(2)参数projection表示坐标轴的类型,可以是None、'aitoff'、'hammer'、'lambert'、'mollweide','polar'或'rectilinear'中的任一取值,也可以使用自定义的类型。
(3)参数polar表示是否使用极坐标,若设为True,则其作用等价于projection=‘polar’。
(4)参数aspect表示坐标轴缩放的比例,可接受‘auto’、‘equal’、num中任一取值。
(5)参数frame_on表示是否绘制每个坐标轴的轴脊。
定制刻度
定制刻度的位置与格式
在matplotlib中,刻度线分为主刻度线和次刻度线,次刻度线默认是隐藏的。matplotlib.ticker模块中提供了两个类:Locator和Formatter,分别代表刻度定位器和刻度格式其,用于指定刻度线的位置和刻度标签的格式。
刻度定位器
Locator 是刻度定位器的基类,它派生了很多自类,可以自动调整刻度的间距、选择刻度的位置,其常见的子类如图所示:
除此之外,matplotlib.dates模块中还提供了很多与日期时间相关的定位器:
除了这些matplotlib内置的刻度定位器之外,matplotlib也支持自定义刻度定位器,只需要定义一个Locator的子类,并在该子类中重写_call_()方法即可。
刻度格式器
Formatter是刻度格式器的基类,它派生了很多子类,可以自动调整刻度标签的格式。
其常见子类如表所示:
除此之外,matplotlib.dates模块中还提供了很多与日期时间相关的格式器:
除此之外,matplotlib同样支持自定义格式器,只要定义一个Formatter的子类,并在该子类中重写_call_()方法即可。
定制刻度的样式
在matplotlib中, 坐标轴的刻度有着固定的样式(方向、颜色等)。pyplot中可以使用tick_params()函数定制刻度样式,其语法格式如下:
tick_params(axis='both', **kwargs)
该函数的常用参数含义如下:
- axis:表示选择操作的轴,可以取值为‘x’、‘y’或‘both’,默认为‘both’。
- reset:若设为True,表示在处理其他参数之前均使用参数的默认值。
- which:表示刻度的类型,可以取值为‘major’、‘minor’或‘both’,默认为‘both’。
- direction:表示刻度线的方向,可以取值为‘in’、‘out’或‘inout’。
- length:表示刻度线的长度。
- width:表示刻度线的宽度。
- color:表示刻度线的颜色。
- pad:表示刻度线与刻度标签的距离。
- labelsize:表示刻度标签的字体大小。
- labelcolor:表示刻度标签的颜色。
- bottom,top,left,right:表示是否显示下方、上方、左侧、右侧的刻度线。
- labelbottom,labeltop,labelleft,labelright:表示是否显示下方、上方、左侧、右侧的刻度标签。
- labelrotation:表示刻度标签旋转的角度。
此外还可以使用tick_params()方法或set_tick_params()方法定制刻度的样式。
隐藏轴脊
隐藏全部轴脊
使用pyplot的axis()函数可以设置或获取一些坐标轴的属性,包括显示或隐藏坐标轴的轴脊。
axis()函数的语法格式如下:
axis(option, *args, **kwargs)
该函数的参数option可以接收布尔值或字符串。其中,布尔值True表示显示轴脊和刻度,False表示隐藏轴脊和刻度。字符串通常可以是以下任一取值:
- ‘on’:显示轴脊和刻度,等同于True。
- ‘off’:隐藏轴脊和刻度,等同于False。
- ‘equal’:通过更改轴限设置等比例。
- ‘scaled’:通过更改绘图框的尺寸设置等比例。
- ‘tight’:设置足够大的限制以显示所有的数据。
- ‘auto’:自动缩放。
此外,Axes类的对象也可以使用axis()方法隐藏坐标轴的轴脊。
隐藏部分轴脊
在matplotlib中我们只需要访问spines属性获取相应的轴脊后调用set_color()方法将轴脊的颜色设为none即可。但是通过这种方法只会隐藏坐标轴的部分轴脊而不会隐藏轴脊上的刻度,若要同时隐藏轴脊和刻度,可以通过set_ticks_position()方法设置刻度线的颜色为‘none’,通过set_ticklabels()方法设置刻度标签为空列表。
移动轴脊
移动轴脊的位置
在matplotlib中,Spine类提供了一个设置轴脊位置的set_position()方法。其语法格式如下:
set_position(self,position)
该方法的position参数表示轴脊的位置,它需要接收一个包含两个元素的元组(position_type,amount),其中元素position_type代表位置的类型,元素amount代表位置。position_type支持以下任一取值:
- ‘outward’:表示将轴脊置于移出数据区域指定点数的位置。
- ‘axes’:表示将轴脊置于指定的坐标系中(0.0~1.0)。
- ‘data’:表示将轴脊置于指定的数据坐标的位置。
此外,position参数还支持以下两个特殊的轴脊位置:
- ‘center’:值为(‘axes’,0.5)。
- ‘zero’:值为(‘data’,0.0)。
实例:深圳市24小时的平均风速
根据上表的内容,将“时间”作为x轴的数据标签,将“风速(km/h)”作为y轴的数据,使用plot()方法绘制放映深圳市24小时的平均风速的折线图。
具体代码如下:
#导入模块
import matplotlib.pyplot as plt
import numpy as np
from datetime import datetime
from matplotlib.dates import DateFormatter,HourLocator
#设置中文
plt.rcParams["font.sans-serif"]=["SimHei"]
plt.rcParams["axes.unicode_minus"]=False
#准备数据
dates=['201910240','2019102402','2019102404','2019102406',
'2019102408','2019102410','2019102412','2019102414',
'2019102416','2019102418','2019102420','2019102422','201910250']
x_date=[datetime.strptime(d, '%Y%m%d%H') for d in dates]
y_date=np.array([7,9,11,14,8,15,22,11,10,11,11,13,8])
#创建画布和坐标系
fig=plt.figure()
ax=fig.add_axes((0.1,0.1,0.8,0.8))
#绘制图表
plt.plot(x_date,y_date,'->',ms=8,mfc='#FF9900')
#设置标题
ax.set_title('深圳市24小时的平均风速')
ax.set_xlabel('时间')
ax.set_ylabel('平均风速(km/h)')
#设置x轴主刻度的位置和格式
date_fmt=DateFormatter('%H:%M')
ax.xaxis.set_major_formatter(date_fmt)
ax.xaxis.set_major_locator(HourLocator(interval=2))
ax.tick_params(direction='in',length=6,width=2,labelsize=12)
ax.xaxis.set_tick_params(labelrotation=45)
#隐藏上轴脊和右轴脊
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
#展示图表
plt.show()
运行结果如下:
补充内容:patches模块
matplotlib.patches 是专门用于绘制路径和形状的模块,该模块中包含一些表示形状(例如箭头、圆形、长方形等)的类,通过创建这些类的对象可以快速绘制常见的形状。
以创建正多边形为例,RegularPolygon类的构造方法的语法格式如下:
RegularPolygon(xy,numVertices,radius=5,orientation=0, **kwargs)
该方法常用参数的含义如下:
- xy:表示中心点的元组(x,y)。
- numVertices:表示多边形顶点的数量。
- radius:表示从中心店到每个顶点的距离。
- orientation:表示多边形旋转的角度(以弧度为单位)。