二维图表

常见的二维统计图表有线形图、柱状图、面积图和饼图等,本节结合实例介绍MATLAB和Python绘制这几种图表的方法。[大谦MATLAB,dqmatlab点com]

线形图

MATLAB和Python都提供了plot函数绘制线形图。根据序列的个数,线形图有简单线形图和复合线形图等不同类型。

简单线形图

下面给定某商场1-4月的销售数据,用plot函数绘制简单线形图。

【MATLAB】

在MATLAB命令窗口输入:

code.matlab
>> x=["一月", "二月", "三月", "四月"];  %绘图数据
>> y=[100, 80, 120, 150];
>> plot(categorical(1:4,1:4,x,"Ordinal",true),y,'r-')  %绘图
>> title('商场各月销售额')  %标题
>> ylabel('销售额(万元)','FontSize',14)  %y轴标题

生成图19-1。

Document Image Document Image

图19-1 用MATLAB绘简单线形图 图19-2 用Python绘简单线形图

默认时,用MATLAB的plot函数绘线形图时横轴和纵轴都是数值轴。如果要求横轴是分类轴,可以指定横轴刻度线的位置和标签来实现。本例将横轴数据转换为分类数组类型,直接实现分类数据的线形图绘制。

【Python】

Python有很多第三方包可以实现数据可视化,如Matplotlib, Seaborn, Plotly等。本书结合最基础的Matplotlib包进行介绍,很多其他的绘图包都是在Matplotlib包的基础上开发的。

使用Matplotlib包,首先要导入相应的子模块。

code.python
import matplotlib.pyplot as plt

默认时,Matplotlib包不支持中文,绘图之前作以下设置,可以在图表中显示中文。

code.python
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

在Python IDLE Shell窗口输入下面的语句行:

code.python
>>> import matplotlib.pyplot as plt    #导入包
>>> plt.rcParams['font.sans-serif']=['SimHei']    #支持中文
>>> plt.rcParams['axes.unicode_minus']=False
>>> fig, ax=plt.subplots()    #画布、坐标系
>>> months=['一月', '二月', '三月', '四月']    #绘图数据
>>> sales=[100, 80, 120, 150]
>>> plt.plot(months, sales,'r')    #绘线形图
>>> ax.set_ylabel('销售额(万元)')    #y轴标题
>>> ax.set_title('商场各月销售额')    #图表标题
>>> plt.show()    #显示图表

生成图19-2。对比图19-1不难发现,默认设置条件下,用Python绘的图更加舒展、饱满、匀称和大气。但是两种语言都可以对图表中的元素进行定制。

复合线形图

图19-1和图19-2中只有一根折线,它是根据给定的一组数据绘制的。如果同时给定了几组数据,每组数据用一根折线来表现,就构成了复合线形图。不同折线可以用不同颜色、线型和线宽进行区分。复合图表需要添加图例对各组图形进行说明。

下面给定2个商场1-4月的销量数据进行绘图。

【MATLAB】

在MATLAB命令窗口输入:

code.matlab
>> x=["一月", "二月", "三月", "四月"];    %绘图数据,2组
>> y=[100, 80, 120, 150;180, 130, 160, 170];
>> p=plot(categorical(1:4,1:4,x,"Ordinal",true),y(1,:),'r-*',...    %红色实线和绿色虚线
categorical(1:4,1:4,x,"Ordinal",true),y(2,:),'g-.o');
>> p(1).LineWidth=2;    %第1根折线线宽为2
>> ylabel('销售额(万元)','FontSize',14)    %y轴标题
>> title('两个商场各月销售额')    %图表标题
>> legend("商场A","商场B",'Location','SouthEast')    %图例,右下角

生成图19-3。

Document Image Document Image

图19-3 用MATLAB绘复合线形图 图19-4 用Python绘复合线形图

【Python】

在Python IDLE Shell窗口输入下面的语句行:

code.python
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> plt.rcParams['font.sans-serif']=['SimHei']
>>> plt.rcParams['axes.unicode_minus']=False
>>> fig, ax=plt.subplots()
>>> sales1=[100, 80, 120, 150]    #两组数据
>>> sales2=[180, 130, 160, 170]
>>> plt.plot(months, sales1,'r-*',linewidth=2)    #分别绘制两组数据
>>> plt.plot(months, sales2,'g-.o')
>>> labels=['一月', '二月', '三月', '四月']
>>> plt.xticks([0,1,2,3],labels,fontsize=16)    #横轴刻度标签
>>> ax.set_ylabel('销售额(万元)')    #y轴标题
>>> ax.set_title('两个商场各月销售额')    #图表标题
>>> plt.legend(labels=['商场A','商场B'],loc='lower right',fontsize=16)    #图例
>>> plt.show()

生成图19-4。

柱状图

柱状图用矩形区域来表现数据的大小,在外观上比线形图更加饱满,更有视觉冲击力。根据序列的个数,柱状图可有简单柱状图和复合柱状图。MATLAB和Python都使用bar函数绘制柱状图。

简单柱状图

下面使用绘制简单线形图相同的数据绘制简单柱状图。

【MATLAB】

在MATLAB命令窗口输入:

code.matlab
>> x=["一月", "二月", "三月", "四月"];    %绘图数据
>> y=[100, 80, 120, 150];
>> bar(x,y)    %绘柱状图
>> title('商场各月销售额')    %标题
>> ylabel('销售额(万元)','FontSize',14)    %y轴标题

生成图19-5。

Document Image Document Image

图19-5 用MATLAB绘简单柱状图 图19-6 用Python绘简单柱状图

【Python】

在Python IDLE Shell窗口输入下面的语句行:

code.python
>>> import matplotlib.pyplot as plt
>>> plt.rcParams['font.sans-serif']=['SimHei']
>>> plt.rcParams['axes.unicode_minus']=False
>>> fig, ax=plt.subplots()
>>> months=['一月', '二月', '三月', '四月']    #绘图数据
>>> sales=[100, 80, 120, 150]
>>> bar_labels=['一月', '二月', '三月', '四月']
>>> plt.bar(months, sales, label=bar_labels)    #绘柱状图
>>> ax.set_ylabel('销售额(万元)')    #y轴标题
>>> ax.set_title('商场各月销售额')    #标题
>>> plt.show()

生成图19-6。

2复合柱状图

下面使用绘制复合线形图相同的数据绘制复合柱状图。

【MATLAB】

在MATLAB命令窗口输入:

code.matlab
>> x=["一月", "二月", "三月", "四月"];
>> y=[100, 80, 120, 150;180, 130, 160, 170];
>> bar(x,y)
>> title('两个商场各月销售额')
>> ylabel('销售额(万元)','FontSize',14)
>> legend("商场A","商场B")

生成图19-7。

Document Image Document Image

图19-7 用MATLAB绘复合柱状图 图19-8 用Python绘复合柱状图

【Python】

在Python IDLE Shell窗口输入下面的语句行:

code.python
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> plt.rcParams['font.sans-serif']=['SimHei']
>>> plt.rcParams['axes.unicode_minus']=False
>>> fig, ax=plt.subplots()
>>> t=np.array([1,2,3,4])
>>> sales1=[100, 80, 120, 150]
>>> sales2=[180, 130, 160, 170]
>>> plt.bar(t, sales1,width=0.25,color='b')    #绘制第1个序列
>>> plt.bar(t+0.25, sales2,width=0.25,color='g')    #绘制第2个序列,x坐标的变化
>>> bar_labels=['一月', '二月', '三月', '四月']
>>> plt.xticks(t+0.125,bar_labels,fontsize=16)    #横轴刻度线和刻度标签
>>> ax.set_ylabel('销售额(万元)')
>>> ax.set_title('两个商场各月销售额')
>>> plt.legend(labels=['商场A','商场B'],loc='upper right',fontsize=16)
>>> plt.show()

生成图19-8。可见,用Python绘制复合柱状图需要计算各序列中柱形所在位置的横坐标,并计算横轴刻度线和刻度标签的位置。

面积图

跟柱状图一样,面积图也是用面来表现数据的大小和分布。不同的是,它是用序列对应的折线与横轴之间的面表示数据。

简单面积图

下面使用绘线形图和柱状图相同的数据绘面积图。

【MATLAB】

MATLAB中用area函数绘制面积图。在MATLAB命令窗口输入:

code.matlab
>> x=["一月", "二月", "三月", "四月"];
>> y=[100, 80, 120, 150];
>> area(categorical(1:4,1:4,x,"Ordinal",true),y)    %绘简单面积图
>> title('商场各月销售额')
>> ylabel('销售额(万元)','FontSize',14)

生成图19-9。

Document Image Document Image

图19-9 用MATLAB绘简单面积图 图19-10 用Python绘简单面积图

【Python】

Python中用stackplot函数绘面积图。在Python IDLE Shell窗口输入下面的语句行:

code.python
>>> import matplotlib.pyplot as plt
>>> plt.rcParams['font.sans-serif']=['SimHei']
>>> plt.rcParams['axes.unicode_minus']=False
>>> fig, ax=plt.subplots()
>>> months=['一月', '二月', '三月', '四月']
>>> sales=[100, 80, 120, 150]
>>> plt.stackplot(months, sales,color='y')    #绘面积图
>>> ax.set_ylabel('销售额(万元)')
>>> ax.set_title('商场各月销售额')
>>> plt.show()

生成图19-10。

堆叠面积图

有多组数据的情况,可以用堆叠面积图来进行表现。

【MATLAB】

在MATLAB命令窗口输入:

code.matlab
>> x=["一月", "二月", "三月", "四月"];
>> y=[100,180;80,130;120,160;150,170];
>> area(categorical(1:4,1:4,x,"Ordinal",true),y)    %绘堆叠面积图
>> ylabel('销售额(万元)','FontSize',14)
>> title('两个商场各月销售额')
>> legend("商场A","商场B",'Location','SouthEast')

生成图19-11。

Document Image Document Image

图19-11 用MATLAB绘堆叠面积图 图19-12 用Python绘堆叠面积图

【Python】

在Python IDLE Shell窗口输入下面的语句行:

code.python
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> plt.rcParams['font.sans-serif']=['SimHei']
>>> plt.rcParams['axes.unicode_minus']=False
>>> fig, ax=plt.subplots()
>>> months=['一月', '二月', '三月', '四月']
>>> sales1=[100, 80, 120, 150]
>>> sales2=[180, 130, 160, 170]
>>> plt.stackplot(months, sales1,sales2)    #绘堆叠面积图
>>> labels=['一月', '二月', '三月', '四月']
>>> plt.xticks([0,1,2,3],labels,fontsize=16)
>>> ax.set_ylabel('销售额(万元)')
>>> ax.set_title('两个商场各月销售额')
>>> plt.legend(labels=['商场A','商场B'],loc='lower right',fontsize=16)
>>> plt.show()

生成图19-12。

饼图

饼图常用于表现部分与整体之间的比例关系,它用圆形区域表示整体,用圆形区域中的扇形区域表示组成整体的各部分。MATLAB和Python中都使用pie函数绘制饼图。使用爆炸效果,可以将指定扇区与饼图整体分离显示。

【MATLAB】

在MATLAB命令窗口输入:

code.matlab
>> sales=[100 80 120 150 200];
>> labels=["一月" "二月" "三月" "四月" "五月"];
>> explode=[1 0 0 0 0];    %用数组表示各扇区是否分离,1表示分离
>> pie(sales,explode,labels)    %绘饼图
>> title('商场各月销售额')

生成图19-13。

Document Image Document Image

图19-13 用MATLAB绘饼图 图19-14 用Python绘饼图

【Python】

在Python IDLE Shell窗口输入下面的语句行:

code.python
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> plt.rcParams['font.sans-serif']=['SimHei']
>>> plt.rcParams['axes.unicode_minus']=False
>>> fig, ax=plt.subplots()
>>> sales=[100, 80, 120, 150,200]
>>> labels=['一月', '二月', '三月', '四月', '五月']
>>> #绘饼图,explode参数设置哪个扇区分离以及分离的距离
>>> plt.pie(sales,labels=labels,explode=[0.2,0,0,0,0])
>>> ax.set_title('各月销售情况')
>>> plt.show()

生成图19-14。注意,pie函数中explode参数表示各扇区的分离情况,列表中元素的值不为0时表示对应的扇区分离,数字的大小表示分离的距离与圆的半径的比值。例如本例中列表的第1个元素为0.2,表示它对应的第1个扇区分离,分离的距离为圆半径乘以0.2。

环状图

环状图与饼图类似,也用来表现部分与整体之间的关系。

【MATLAB】

MATLAB中使用donutchart函数绘制环状图。在MATLAB命令窗口输入:

code.matlab
>> sales=[100 80 120 150 200];
>> labels=["一月" "二月" "三月" "四月" "五月"];
>> donutchart(sales,labels)    %绘环状图
>> title('商场各月销售额')

生成图19-15。

Document Image Document Image

图19-15 用MATLAB绘饼图 图19-16 用Python绘饼图

【Python】

Python中使用pie函数绘制环状图,用该函数的wedgeprops参数设置环状的宽度。在Python IDLE Shell窗口输入下面的语句行:

code.python
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> plt.rcParams['font.sans-serif']=['SimHei']
>>> plt.rcParams['axes.unicode_minus']=False
>>> fig, ax=plt.subplots()
>>> sales=[100, 80, 120, 150,200]
>>> labels=['一月', '二月', '三月', '四月', '五月']
>>> plt.pie(sales,radius=1,labels=labels,wedgeprops=dict(width=0.3,edgecolor='w'))
>>> ax.set_title('各月销售情况')
>>> plt.show()

生成图19-16。