Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等。Matplotlib可以绘制的图表的类型包括条形图、柱状图、折线图、饼图、散点图、面积图、环形图、雷达图等。
此外,通过图表的相互叠加还可以生成复合型图表。不同类型的图表适用不同的场景,可以按使用目的选择合适的图表类型。下面通过一张框架图来说明,如下图所示:
目录
1.Matplotlib图表的组成
Matplotlib可以绘制的图表有很多种,但每一种图表的绝大组成部分是基本相同的,一张完整的图表一般包括画布、图表标题、绘图区、数据系列、坐标轴、坐标轴标题、图例、文本标签、网格线等,如下图所示。
下面详细介绍各个组成部分的功能。
(1)画布:图中最大的白色区域,作为其他图表元素的容器。
(2)图表标题:用来概况图表内容的文字,常用的功能有设置字体、字号及字体颜色等。
(3)绘图区:画布中的一部分,即显示图形的矩形区域,可改变填充颜色、位置,以便图表展示更好的图形效果。
(4)数据系列:在数据区域中,同一列(或同一行)数值数据的集合构成一组数据系列,也就是图表中相关数据点的集合。图表中可以有一组到多组数据系列,多组数据系列之间通常采用不同的图案、颜色或符号来区分。
(5)坐标轴及坐标轴标题:坐标轴是标识数值大小及分类的垂直线和水平线,上面有标定数据值的标志(刻度)。一般情况下,水平轴(x轴)表示数据的分类;坐标轴标题用来说明坐标轴的分类及内容,分为水平坐标轴和垂直坐标轴。
(6)图例:是指示图表中系列区域的符号、颜色或形状定义数据系列所代表的内容。图例由两部分构成,即图例标示和图例项。其中,图例标示,代表数据系列的图案,即不同颜色的小方块;图例项,与图例标示对应的数据系列名称。一种图例标示只能对应一种图例项。
(7)文本标签:用于为数据系列添加说明文字。
(8)网格线:贯穿绘图区的线条,类似标尺可以衡量数据系列数值的标准。常用的功能有设置网格线宽度、样式、颜色、坐标轴等。
2.Matplotlib图表的常用设置
接下来,介绍Matplotlib图表的常用设置,主要包括颜色设置、线条样式、标记样式、设置画布、坐标轴、添加文本标签、设置标题和图例、添加注释文本、调整图表与画布边缘间距,以及其他相关设置等。
2.1 plot()基本函数
Matplotlib基本绘图主要使用plot()函数,语法如下:
matplotlib.pyplot.plot(x,y,format_string,**kwargs)
x:x轴数据
y:y轴数据
format_string:控制曲线格式的字符串,包括颜色、线条样式和标记样式
**kwargs:键值参数,相当于一个字典
例如,使用plot()函数绘制一个简单的折线图
import matplotlib.pyplot as plt
x=range(0,30,3)
y=range(1,50,5)
plt.plot(x,y)
plt.show()
我们还可以将x,y的值从文件中读取。下面导入Excel体温表,分析下14天基础体温情况,程序代码如下:
import matplotlib.pyplot as plt
import pandas as pd
df=pd.read_excel(r'C:\Users\zex\Desktop\MR\Code\05\04\体温.xls')
x=df['日期']
y=df['体温']
plt.plot(x,y)
plt.show()
上面的这张图表很粗糙,我们将一步一步完善这张图表。下面介绍图表中线条颜色、线条样式和标记样式的设置。
1.颜色设置
color参数可以设置线条颜色,通用颜色值如下表
其他颜色可以通过十六进制字符串指定,或者指定颜色名称,例如:
- 浮点形式的RGB或RGBA元组,例如(0.1, 0.2, 0.5)或(0.1, 0.2, 0.5, 0.3)。
- 十六进制的RGB或RGBA字符串,例如#0F0F0F或#0F0F0F0F。
- 0~1的小数作为灰度值,例如0.5。
- {'b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'},其中的一个颜色值。
- X11/CSS4规定中的颜色名称。
- Xkcd中指定的颜色名称,例如xkcd:sky blue
- Tableau调色板中的颜色,例如{'tab:blue', 'tab:orange', 'tab:green','tab:red', 'tab:purple', 'tab:brown','tab:pink', 'tab:gray', 'tab:olive','tab:cyan'}。
- CN格式的颜色循环,对应的颜色设置代码如下:
01 from cycler import cycler
02 colors=['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2','#7f7f7f', '#bcbd22', '#17becf']
03 plt.rcParams['axes.prop_cycle'] = cycler(color=colors)
2.线条样式
linestyle可选参数可以设置线条的样式,设置值如下,设置后的效果如下图
“-”:实线,默认值
“--”:双画线
“-.”:点画线
“:”:虚线
3.标记样式
marker可选参数可以设置标记样式,设置值如下表所示
下面为“14天基础体温曲线图”设置颜色和样式,并在实际体温位置进行标记,主要代码如下:
plt.plot(x,y,color='m',linestyle='-',marker='o',mfc='w')
2.2 设置画布
画布就像我们画画的画板一样,在Matplotlib中可以使用figure()方法设置画布大小、分辨率、颜色和边框等,语法如下:
matpoltlib.pyplot.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
- num:图像编号或名称,数字为编号,字符串为名称,可以通过该参数激活不同的画布。
- figsize:指定画布的宽和高,单位为英寸。
- dpi:指定绘图对象的分辨率,即每英寸多少个像素,默认值为80。像素越大画布越大。
- acecolor:背景颜色。
- edgecolor:边框颜色。
- frameon:是否显示边框,默认值为True,绘制边框;如果为False,则不绘制边框。
例如,自定义一个5×3的黄色画布,主要代码如下
fig=plt.figure(figsize=(5,3),facecolor='yellow')
figsize=(5,3),因为实际画布大小是500×300,所以这里不要输入太大的数字。
2.3 设置坐标轴
一张精确的图表,其中不免要用到坐标轴,下面介绍Matplotlib中坐标轴的使用。
1.x轴、y轴标题
设置x轴和y轴标题主要使用xlabel()函数和ylabel()函数。
例如,修改上一个体温折线图案例,设置x轴标题为“2023年7月”,y轴标题为“基础体温”,程序代码如下:
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif']=['SimHei']
# fig=plt.figure(figsize=(5,3),facecolor='yellow')
df=pd.read_excel(r'C:\Users\zex\Desktop\MR\Code\05\04\体温.xls')
x=df['日期']
y=df['体温']
plt.xlabel('2023年7月')
plt.ylabel('基础体温')
plt.plot(x,y,color='m',linestyle='-',marker='o',mfc='w')
plt.show()
在本示例中,应注意两个问题,即中文乱码问题和符号不显示问题。它们在实际编程过程中经常出现。
(1)解决中文乱码问题,代码如下:
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
(2)解决负号不显示问题,代码如下:
plt.rcParams['axes.unicode_minus'] = False #解决负号不显示
2.坐标轴刻度
用matplotlib画二维图像时,默认情况下的横坐标(x轴)和纵坐标(y轴)显示的值有时可能达不到我们的需求,需要借助xticks()函数和yticks()函数分别对x轴和y轴的值进行设置。
xticks()函数的语法如下:
xticks(locs, [labels], **kwargs)
locs:数组,表示x轴上的刻度。例如,x轴的刻度是2~14的偶数,如果想改变这个值,就可以通过locs参数设置。
labels:也是数组,默认值和locs相同。locs表示位置,而labels则决定该位置上的标签,如果赋予labels空值,则x轴将只有刻度而不显示任何值。
例如,在“14天基础体温折线图”中,x轴是从2~14的偶数,但实际日期是从1~14的连续数字,下面使用xticks()函数来解决这个问题,将x轴的刻度设置为1~14的连续数字,主要代码如下:
plt.xticks(range(1,15,1))
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif']=['SimHei']
# fig=plt.figure(figsize=(5,3),facecolor='yellow')
df=pd.read_excel(r'C:\Users\zex\Desktop\MR\Code\05\04\体温.xls')
x=df['日期']
y=df['体温']
plt.xlabel('2023年7月')
plt.ylabel('基础体温')
plt.xticks(range(1,15,1))
plt.plot(x,y,color='m',linestyle='-',marker='o',mfc='w')
plt.show()
在上述示例中,日期看起来不是很直观。下面将x轴刻度标签直接改为日,主要代码
dates=['1日','2日','3日','4日','5日',
'6日','7日','8日','9日','10日',
'11日','12日','13日','14日']
plt.xticks(range(1,15,1),dates)
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif']=['SimHei']
# fig=plt.figure(figsize=(5,3),facecolor='yellow')
df=pd.read_excel(r'C:\Users\zex\Desktop\MR\Code\05\04\体温.xls')
x=df['日期']
y=df['体温']
plt.xlabel('2023年7月')
plt.ylabel('基础体温')
dates=['1日','2日','3日','4日','5日',
'6日','7日','8日','9日','10日',
'11日','12日','13日','14日']
plt.xticks(range(1,15,1),dates)
plt.plot(x,y,color='m',linestyle='-',marker='o',mfc='w')
plt.show()
3.坐标轴范围
坐标轴范围是指x轴和y轴的取值范围。设置坐标轴范围主要使用xlim()函数和ylim()函数。
例如,设置x轴(日期)范围为1~10,y轴(基础体温)范围为35~40,主要代码如下:
可以看到,将纵坐标范围变大后,相较于原图,折线的幅度变小了,比之前平滑了。而横坐标范围变小之后,相较于之前,后面的数据被截断。
4. 网格线
很多时候为了图表的美观,不得不考虑细节。下面介绍图表细节之一——网格线,主要使用grid()函数,首先生成网格线,代码如下:
plt.grid()
grid()函数也有很多参数,如颜色、网格线的方向(参数axis='x'隐藏x轴网格线,axis='y'隐藏y轴网格线)、网格线样式和网格线宽度等。下面为图表设置网格线,主要代码如下:
plt.grid(color='0.5',linestyle='--',linewidth=1)
2.4 添加文本标签
绘图过程中,为了能够更清晰、直观地看到数据,有时需要给图表中指定的数据点添加文本标签。主要使用text()函数,语法如下:
matplotlib.pyplot.text(x, y, s, fontdict=None, withdash=False, **kwargs)
- x:x坐标轴的值
- y:y坐标轴的值
- s:字符串,注释内容
- fontdict:字典,可选参数,默认值为None。用于重写默认文本属性。
- withdash:布尔型,默认值为False,创建一个TexWithDash实例,而不是Text实例
- **kwargs:关键字参数。这里指通用的绘图参数,如字体大小fontsize=12、垂直对齐方式horizontalalignment='center'(或简写为ha='center')、水平对齐方式verticalalignment='center'(或简写为va='center')。
例如,为图表中各个数据点添加文本标签,关键代码如下:
for a,b in zip(x,y):
plt.text(a,b,'%.1f'%b,ha='center',va='bottom',fontsize=9)
在本示例代码中,首先,x、y是x轴和y轴的值,它代表了折线图在坐标中的位置,通过for循环找到每一个x、y值相对应的坐标赋值给a、b,再使用plt.text在对应的数据点上添加文本标签,而for循环也保证了折线图中每一个数据点都有文本标签。%.1f'%b是对y值进行的格式化处理,保留小数点1位;ha='center'、va='bottom'代表水平对齐、垂直对齐的方式,fontsize则是字体大小。
2.5 设置标题和图例
数据是一个图表所要展示的内容,而有了标题和图例则可以帮助我们更好地理解这个图表的含义和想要传递的信息。
1.图表标题
为图表设置标题主要使用title()函数,语法如下:
matplotlib.pyplot.title(label, fontdict=None, loc='center', pad=None, **kwargs)
- label:字符串,表示图表标题文本。
- fontdict:字典,用来设置标题字体的样式。如{'fontsize':20,'fontweight':20,'va': 'bottom','ha':'center'}
- loc:字符串,表示标题水平位置,参数值为center、left或right,分别表示水平居中、水平居左和水平居右,默认为水平居中
- pad:浮点型,表示标题离图表顶部的距离,默认值为None
- **kwargs:关键字参数,可以设置一些其他文本属性
例如,设置图表标题为“14天基础体温曲线图”,主要代码如下:
plt.title('14天基础体温曲线图',fontsize=10)
2.图表图例
为图表设置图例主要使用legend()函数。下面介绍图例相关的设置。
(1)自动显示图例
plt.legend()
(2)手动添加图例
plt.legend('基础体温')
(3)设置图例显示位置
通过loc参数可以设置图例的显示位置,如在左下方显示,主要代码如下:
plt.legend(('基础体温',),loc='upper right',fontsize=8)
当手动添加图例时,有时会出现文本显示不全,解决方法是在文本后面加一个逗号(,),主要代码如下:
plt.legend(('基础体温',))
具体图例显示位置的设置如下表所示
上述参数可以设置大概的图例位置,如果这样可以满足需求,那么第二个参数不设置也可以。第二个参数bbox_to_anchor是元组类型,包括两个值:num1用于控制legend的左右移动,值越大越向右边移动;num2用于控制legend的上下移动,值越大,越向上移动。这两个值用于微调图例的位置。
另外,通过该参数还可以设置图例位于图表外面,主要代码如下:
plt.legend(('基础体温',),bbox_to_anchor=(0.8,1.1),loc=2,borderaxespad=0)
2.6 添加注释
annotate()函数用于在图表上给数据添加文本注释,而且支持带箭头的画线工具,方便我们在合适的位置添加描述信息。
例如,在“14天基础体温折线图”中用箭头指示最高体温,效果如下图所示
代码如下;
plt.annotate('最高体温',
xy=(9,37.1),
xytext=(10.5,37.1),
xycoords='data',
arrowprops=dict(facecolor='r',shrink=0.05))
xy:被注释的坐标点,二维元组,如(x,y)。
xytext:注释文本的坐标点(也就是本示例中箭头的位置),也是二维元组,默认与xy相同
xycoords:是被注释点的坐标系属性,设置值如下表所示。:
arrowprops:箭头的样式,dict(字典)型数据。如果该属性非空,则会在注释文本和被注释点之间画一个箭头。arrowprops参数设置值如下表所示:
关于annotate()函数的内容还有很多,这里不再赘述。
2.7 调整间距
很多时候发现绘制出的图表出现显示不全的情况,其原因在于,x轴、y轴标题与画布边缘距离太近。
这种情况可以使用subplots_adjust()函数来调整,该函数主要用于调整图表与画布的间距,也可以调整子图表的间距。语法如下:
subplots_adjust(left=None, bottom=None,right=None, top=None,wspace=None,hspace=None)
left、bottom、right和top:这4个参数是用来调整上、下、左、右的空白。注意这里是从画布的左下角开始标记,取值为0~1。left和bottom值越小,则空白越少;而right和top值越大,则空白越少。
wspace和hspace:用于调整列间距和行间距。
举个简单的例子,调整图表上、下、左、右的空白,主要代码如下:
plt.subplots_adjust(left=0.2,bottom=0.2,right=0.9,top=0.9)
如果只显示图片,坐标轴及标题都不显示,可以使用如下代码
plt.subplots_adjust(left=0,bottom=0,right=1,top=1,hspace=0.1,wspace=0.1)
2.8 其他设置
1.坐标轴的刻度线
设置4个方向的坐标轴上的刻度线是否显示,主要代码如下:
(1)设置4个方向的坐标轴上的刻度线是否显示,主要代码如下:
plt.tick_params(bottom=False,left=True,right=True,top=True)
(2)设置x轴和y轴的刻度线显示方向,其中in表示向内,out表示向外,inout表示在中间,默认刻度线向外,主要代码如下:
plt.rcParams['xtick.direction']='in'#x轴刻度线向内显示
plt.rcParams['ytick.direction']='in'#y轴刻度线向内显示
2.坐标轴相关属性设置
- axis():返回当前axes范围。
- axis(v):通过输入v = [xmin, xmax, ymin, ymax],设置x、y轴的取值范围。
- axis('off'):关闭坐标轴轴线及坐标轴标签。
- axis('equal'):使x、y轴长度一致。
- axis('scaled'):调整图框的尺寸(而不是改变坐标轴取值范围),使x、y轴长度一致。
- axis('tight'):改变x轴和y轴的限制,使所有数据被展示。如果所有的数据已经显示,它将移动到图形的中心而不修改(xmax~xmin)或(ymax~ymin)。
- axis('image'):缩放axis范围(limits),等同于对data缩放范围。
- axis('auto'):自动缩放。
- axis('normal'):不推荐使用。恢复默认状态,轴限的自动缩放以使数据显示在图表中。