Matplotlib是一个Python的绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出 版质量级别的图形,它能够输出的图形包括折线图、散点图、直方图等。在数据可视化方面, Matplotlib拥有数量众多的用户,其强大的绘图功能能够帮助我们对数据形成非常清晰直观 的认知。 5.1 初识Matplotlib 1.Figure(图) Matplotlib 是一个非常优秀的Python2D 绘图库,只要给出符合格式的数据,通过 Matplotlib就可以方便地制作各种高质量的图形,在任何绘图之前,我们需要一个Figure对 象,可以理解成我们需要一张画板才能开始绘图。 import matplotlib.pyplot as plt fig=plt.figure() 2.Axes(轴) 在拥有Figure对象之后,在作画前还需要Axes(轴),没有轴的话就没有绘图基准,所以 需要添加Axes。也可以理解成为真正可以作画的纸。 #图像显示中文说明 plt.rcParams['font.sans-serif'] = [u'SimHei'] fig=plt.figure() fig=plt.figure() ax=fig.add_subplot(111) ax.set(xlim=[0.5,4.5],ylim=[-2,8],title='轴实例',ylabel='Y-轴',xlabel='X-轴') plt.show() 以上代码实现了在一幅图上添加了一个Axes,然后设置了这个Axes的X轴以及Y轴的 取值范围,效果如图5-1所示。 上面代码中的fig.add_subplot(111)语句是用于添加Axes的,参数的解释为:在画板的 第1行第1列的第一个位置生成一个Axes对象来准备作画。也可以通过fig.add_subplot(2, 2,1)的方式生成Axes,前面两个参数确定了面板的划分,例如2,2会将整个面板划分成2* 2的方格,第三个参数取值范围是[1,2*2],表示第几个Axes。如下面的代码: 1 57 图5-1 轴的设置 fig=plt.figure() ax1=fig.add_subplot(221) ax2=fig.add_subplot(222) ax3=fig.add_subplot(224) 运行程序,得到3个子图,如图5-2所示。 图5-2 创建的3个子图 3.MultipleAxes轴 从上面的代码中可以发现我们上面添加Axes似乎不够简洁,所以提供了下面的方式一 次性生成所有的Axes: fig,axes=plt.subplot(nrows=2,ncols=2) axes[0,0].set(title='左上限') axes[0,1].set(title='右上限') axes[1,0].set(title='左下限') axes[1,1].set(title='右下限') fig还是我们熟悉的画板,axes成了我们常用二维数组的形式访问,这在循环绘图时比较 好用。 1 58 4.Axes与.pyplot 相信不少人看过下面的代码,很简单并易懂,但是下面的作画方式只适合简单的绘图,快 速地将图绘出。在处理复杂的绘图工作时,我们还是需要使用Axes来完成作画的。 plt.plot([1,4,7,9],[10,18,25,36],color='lightred',linewidth=3) plt.xlim(0.5,5.0) plt.show() 5.2 基本二维绘图 5.2.1 折线图 Matplotlib的用法非常简单,对于最简单的折线图来说,程序只需根据需要给出对应的X 轴、Y轴数据。调用pyplot子模块下的plot()函数即可生成简单的折线图。 【例5-1】 分析某教材从2012年到2018年的销售数据,此时可考虑将年份作为X 轴数 据,将图书各年份的销量作为Y 轴数据。程序只要将2012—2018年定义成list列表作为X 轴数据,并将对应年份的销量作为Y轴数据即可。 如使用如下简单程序来展示从2012年到2018年某教材的销售数据。 import matplotlib.pyplot as plt #定义2 个列表分别作为X 轴、Y 轴数据 x_data = ['2012', '2012', '2013', '2014', '2015', '2016', '2018'] y_data = [ 60200, 63000, 71000, 84000, 90500, 107000,98300] #第一个列表代表横坐标的值,第二个代表纵坐标的值 plt.plot(x_data, y_data) #调用show()函数显示图形 plt.show() 运行程序,效果如图5-3所示。 图5-3 简单折线图 如果在调用plot()函数时只传入一个list列表,该list列表的数据将作为Y 轴数据,那么 Matplotlib会自动使用0、1、2、3作为X轴数据。例如,修改以下代码: plt.plot(y_data) 运行程序,效果如图5-4所示。 plot()函数除了支持创建具有单条折线的折线图外,还支持创建包含多条折线的复式折 线图———只要在调用plot()函数时传入多个分别代表X 轴和Y 轴数据的list列表即可。例 1 59 图5-4 使用默认的X轴数据 如以下代码: import matplotlib.pyplot as plt x_data = ['2012', '2012', '2013', '2014', '2015', '2016', '2018'] #定义2 个列表分别作为两条折线的Y 轴数据 y_data = [ 60200, 63000, 71000, 84000, 90500, 107000,98300] y_data2 = [52000, 54200, 51500,58300, 56800, 59500, 62700] #传入2 组数据分别代表X 轴、Y 轴的数据 plt.plot(x_data, y_data, x_data, y_data2) #调用show()函数显示图形 plt.show() 在以上代码中,调用plot()函数时,传入了两组分别代表X轴数据、Y轴数据的list列表, 因此该程序可以显示两条折线,效果如图5-5所示。 图5-5 包含多条折线的复式折线图 也可以通过多次调用plot()函数来生成多条折线。例如,将上面程序中的plt.plot(x_ data,y_data,x_data,y_data2)代码改为如下两行代码,程序同样会生成包含两条折线的复 式折线图。 plt.plot(x_data, y_data) plt.plot(x_data, y_data2) 在调用plot()函数时还可以传入额外的参数来指定折线的样式,如线宽、颜色、样式等。例如: import matplotlib.pyplot as plt x_data = ['2012', '2012', '2013', '2014', '2015', '2016', '2018'] 1 60 #定义2 个列表分别作为两条折线的Y 轴数据 y_data = [ 60200, 63000, 71000, 84000, 90500, 107000,98300] y_data2 = [52000, 54200, 51500,58300, 56800, 59500, 62700] #指定折线的颜色、线宽和样式 plt.plot(x_data, y_data, color = 'red', linewidth = 2.0, linestyle = '-.') plt.plot(x_data, y_data2, color = 'blue', linewidth = 3.0, linestyle = '--') #调用show()函数显示图形 plt.show() 代码中,用color指定折线的颜色,linewidth指定线宽,linestyle指定折线样式。 在使用linestyle指定折线样式时,该参数支持如下字符串参数值。 .-:代表实线,这是默认值。 .--:代表虚线。 . ::代表点线。 .-.:代表短线、点相间的虚线。 运行以上程序,效果如图5-6所示。 图5-6 设置了折线图的线型 5.2.2 散点图 在Matplotlib中使用函数matplotlib.pyplot.scatter()绘制散点图,matplotlib.pyplot. scatter的函数格式如下: matplotlib.pyplot.scatter(x,y,s=None,c=None,marker=None,cmap=None, norm=None,vmin=None,vmax=None,alpha=None,linewidths=None,verts=None, edgecolors=None,hold=None,data=None,**kwargs):参数x,y组成了散点的坐标;s为 散点的面积;c为散点的颜色(默认为蓝色'b');marker为散点的标记;alpha为散点的透明度(0 与1之间的数,0为完全透明,1为完全不透明);linewidths为散点边缘的线宽;如果marker 为None,则使用verts的值构建散点标记;edgecolors为散点边缘颜色。 其他参数如cmap为colormap;norm 为数据亮度;vmin、vmax和norm 配合使用用来归 一化亮度数据,这些都与数据亮度有关。 【例5-2】 绘制散点图。 #绘制普通散点图,如图5-7 所示 import matplotlib import matplotlib.pyplot as plt import numpy as np 1 61 #保证图片在浏览器内正常显示 %matplotlib inline #10 个点 N = 10 x = np.random.rand(N) y = np.random.rand(N) plt.scatter(x, y) plt.show() 图5-7 普通散点图 可以通过设置scatter()函数的相关属性,即可更改散点的大小,代码如下: #每个点随机大小,效果如图5-8 所示 s = (30*np.random.rand(N))**2 plt.scatter(x, y, s=s) plt.show() 图5-8 随机更改散点的大小 还可以通过设置参数c与alpha来更改散点颜色和透明度,代码为: #随机颜色,如图5-9 所示 c = np.random.rand(N) plt.scatter(x, y, s=s, c=c, alpha=0.5) plt.show() 设置scatter()函数的' marker'参数,可更改散点形状,代码为: plt.scatter(x, y, s=s, c=c, marker='^', alpha=0.5) plt.show() %效果如图5-10 所示 1 62 图5-9 更改散点颜色与透明度 图5-10 更改散点形状 还可以在一张图上绘制两组数据的散点,实现代码为: #10 个点 N = 10 x1 = np.random.rand(N) y1 = np.random.rand(N) x2 = np.random.rand(N) y2 = np.random.rand(N) plt.scatter(x1, y1, marker='o') plt.scatter(x2, y2, marker='^') plt.show() %效果如图5-11 所示 图5-11 同一张图绘制两组散点图 1 63 调用legend()函数,可为图像设置图例,例如: plt.scatter(x1, y1, marker='o', label="圆形") plt.scatter(x2, y2, marker='^', label="三角形") plt.legend(loc='best') plt.show() #效果如图5-12 所示 图5-12 为图像设置图例 5.2.3 条形图 条形图或柱形图是一种图表或图形,它显示带有矩形条的分类数据,其高度或长度与它们 所代表的值成比例。可以垂直或水平绘制条形。条形图显示了离散类别之间的比较。图表的 一个轴显示要比较的特定类别,另一个轴表示测量值。 MatplotlibAPI提供了bar()函数,可以在MATLAB样式中以及面向对象的API中使 用。与axis对象一起使用的bar()函数使用大小为(x-width=2;x+ width=2;bottom; bottom + height)来绑定矩形创建条形图,其格式如下: ax.bar(x,height,width,bottom,align):其中x表示条形的x坐标的标量序列。如果 x是条形中心(默认)或左边缘,则对齐控件。height是标量或标量序列,表示条的高度。 width是标量或类似数组,可选,条形的宽度默认为0.8。bottom 是标量或类似数组,可选,条 形的y坐标默认为None。align的可选值为c' enter'或e' dge',默认值为center。 【例5-3】 显示一所学院提供的各种课程的学生人数。 import matplotlib.pyplot as plt import numpy as np import math fig = plt.figure() ax = fig.add_axes([0,0,1,1]) langs = ['C', 'C++', 'Java', 'Python', 'PHP'] students = [22,18,34,28,14] ax.bar(langs,students) plt.show() 运行程序,效果如图5-13所示。 我们可以通过使用条形的厚度和位置来绘制多个条形图。数据变量包含三个系列的四个 值。以下代码将显示四个条形图中的三个。这些条的厚度为0.35个单位。每个条形图将从 前一个移动0.5个单位。数据对象是一个多元图,包含过去4年在工程学院的三个分支中通 过的学生数量。 1 64 图5-13 条形图 data = [[30, 25, 50, 20], [40, 23, 51, 17], [35, 22, 45, 19]] X = np.arange(4) fig = plt.figure() ax = fig.add_axes([0,0,1,1]) ax.bar(X + 0.00, data[0], color = 'b', width = 0.25) ax.bar(X + 0.35, data[1], color = 'g', width = 0.25) ax.bar(X + 0.50, data[2], color = 'r', width = 0.25) plt.show() 运行程序,效果如图5-14所示。 图5-14 绘制多个条形图 堆积条形图是堆叠表示彼此顶部的不同组的条形图。结果为条形图的高度显示组的组合 结果。 pyplot.bar()函数的可选bottom 参数指定条的起始值。它不是从零运行到一个值,而是 图像从底部到顶的值。第一次调用pyplot.bar()绘制蓝色条形图。第二次调用pyplot.bar() 绘制红色条形图,蓝色条形图的底部位于红色条形图的顶部。 N = 5 menMeans = (21, 36, 30, 36, 28) womenMeans = (25, 32, 34, 20, 25) ind = np.arange(N) #组x 的位置 width = 0.35 1 65 fig = plt.figure() ax = fig.add_axes([0,0,1,1]) ax.bar(ind, menMeans, width, color='r') ax.bar(ind, womenMeans, width,bottom=menMeans, color='b') ax.set_ylabel('分数') ax.set_title('按组和性别分数') ax.set_xticks(ind, ('G1', 'G2', 'G3', 'G4', 'G5')) ax.set_yticks(np.arange(0, 81, 10)) ax.legend(labels=['男', '女']) plt.show() 运行程序,效果如图5-15所示。 图5-15 堆积条形图 5.2.4 饼图 饼图广泛地应用于各个领域,用于表示不同分类的占比情况,通过弧度大小来对比各种分 类。饼图通过将一个圆饼按照分类的占比划分成多个区块,整个圆饼代表数据的总量,每个区 块(圆弧)表示该分类占总体的比例大小,所有区块(圆弧)的加和等于100%。 在Matplotlib中,利用pie()函数绘制饼图。函数的格式为: matplotlib.pyplot.pie(x,explode=None,labels=None,colors=None,autopct= None,labeldistance=1.1,pctdistance=0.6,shadow=False,radius=1,startangle=0, counterclock=True,wedgeprops=None,textprops=None,center=0,0,frame=False, rotatelabels=False,*,normalize=None,data=None):其中x是浮点型数组,表示每个扇 形的面积。explode是数组,表示各个扇形之间的间隔,默认值为0。labels是列表,表示各个 扇形的标签,默认值为None。colors是数组,表示各个扇形的颜色,默认值为None。autopct 设置饼图内各个扇形的百分比显示格式,%d%% 为整数百分比,%0.1f为一位小数, %0.1f%%为一位小数百分比,%0.2f%%为两位小数百分比。labeldistance表示标签标记的 绘制位置相对于半径的比例,默认值为1.1,如小于1则绘制在饼图内侧。pctdistance类似于 labeldistance,指定autopct的位置刻度,默认值为0.6。shadow 的值为布尔值True或False, 设置饼图的阴影,默认为False,不设置阴影。radius设置饼图的半径,默认为1。startangle表 示起始绘制饼图的角度,默认为从x轴正方向逆时针画起,如设定startangle=90则从y轴正 方向画起。counterclock是布尔值,设置指针方向,默认为True,即逆时针,False表示顺时针。 wedgeprops是字典类型,默认值为None,参数字典传递给wedge对象用来画一个饼图,例如