常见的二维统计图表有线形图、柱状图、面积图和饼图等,本节结合实例介绍MATLAB和Python绘制这几种图表的方法。[大谦MATLAB,dqmatlab点com]
线形图
MATLAB和Python都提供了plot函数绘制线形图。根据序列的个数,线形图有简单线形图和复合线形图等不同类型。
简单线形图
下面给定某商场1-4月的销售数据,用plot函数绘制简单线形图。
【MATLAB】
在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。
图19-1 用MATLAB绘简单线形图 图19-2 用Python绘简单线形图
默认时,用MATLAB的plot函数绘线形图时横轴和纵轴都是数值轴。如果要求横轴是分类轴,可以指定横轴刻度线的位置和标签来实现。本例将横轴数据转换为分类数组类型,直接实现分类数据的线形图绘制。
【Python】
Python有很多第三方包可以实现数据可视化,如Matplotlib, Seaborn, Plotly等。本书结合最基础的Matplotlib包进行介绍,很多其他的绘图包都是在Matplotlib包的基础上开发的。
使用Matplotlib包,首先要导入相应的子模块。
import matplotlib.pyplot as plt
默认时,Matplotlib包不支持中文,绘图之前作以下设置,可以在图表中显示中文。
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
在Python IDLE Shell窗口输入下面的语句行:
>>> import matplotlib.pyplot as plt #导入包
>>> plt.rcParams['font.sans-serif']=[27;SimHei'] #支持中文
>>> plt.rcParams['axes.unicode_minus']=False
>>> fig, ax=plt.subplots() #画布、坐标系
>>> months=['一月', '二月27;, '三月', '四月'] #绘图数据
>>> 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命令窗口输入:
>> 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('销售额(万元)',x27;FontSize',14) %y轴标题
>> title('两个商场各月销售额') %图表标题
>> legend("商场A","商场B",'Location','SouthEast') %图例,右下角
生成图19-3。
图19-3 用MATLAB绘复合线形图 图19-4 用Python绘复合线形图
【Python】
在Python IDLE Shell窗口输入下面的语句行:
>>> 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命令窗口输入:
>> x=["一月", "二月", "三月", "四月"]; %绘图数据
>> y=[100, 80, 120, 150];
>> bar(x,y) %绘柱状图
>> title('商场各月销售额') %标题
>> ylabel('销售额(万元)',x27;FontSize',14) %y轴标题
生成图19-5。
图19-5 用MATLAB绘简单柱状图 图19-6 用Python绘简单柱状图
【Python】
在Python IDLE Shell窗口输入下面的语句行:
>>> import matplotlib.pyplot as plt
>>> plt.rcParams['font.sans-serif']=['SimHei']
>>> plt.rcParams['axes.unicode_minus']=False
>>> fig, ax=plt.subplots()
>>> months=['一月', '二月27;, '三月', '四月'] #绘图数据
>>> 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命令窗口输入:
>> x=["一月", "二月", "三月", "四月"];
>> y=[100, 80, 120, 150;180, 130, 160, 170];
>> bar(x,y)
>> title('两个商场各月销售额')
>> ylabel('销售额(万元)','FontSize',14)
>> legend("商场A","商场B")
生成图19-7。
图19-7 用MATLAB绘复合柱状图 图19-8 用Python绘复合柱状图
【Python】
在Python IDLE Shell窗口输入下面的语句行:
>>> 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命令窗口输入:
>> x=["一月", "二月", "三月", "四月"];
>> y=[100, 80, 120, 150];
>> area(categorical(1:4,1:4,x,"Ordinal",true),y) %绘简单面积图
>> title('商场各月销售额')
>> ylabel('销售额(万元)','FontSize',14)
生成图19-9。
图19-9 用MATLAB绘简单面积图 图19-10 用Python绘简单面积图
【Python】
Python中用stackplot函数绘面积图。在Python IDLE Shell窗口输入下面的语句行:
>>> 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命令窗口输入:
>> 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。
图19-11 用MATLAB绘堆叠面积图 图19-12 用Python绘堆叠面积图
【Python】
在Python IDLE Shell窗口输入下面的语句行:
>>> 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命令窗口输入:
>> sales=[100 80 120 150 200];
>> labels=["一月" "二月" "三月" "四月" "五月"];
>> explode=[1 0 0 0 0]; %用数组表示各扇区是否分离,1表示分离
>> pie(sales,explode,labels) %绘饼图
>> title('商场各月销售额')
生成图19-13。
图19-13 用MATLAB绘饼图 图19-14 用Python绘饼图
【Python】
在Python IDLE Shell窗口输入下面的语句行:
>>> 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命令窗口输入:
>> sales=[100 80 120 150 200];
>> labels=["一月" "二月" "三月" "四月" "五月"];
>> donutchart(sales,labels) %绘环状图
>> title('商场各月销售额')
生成图19-15。
图19-15 用MATLAB绘饼图 图19-16 用Python绘饼图
【Python】
Python中使用pie函数绘制环状图,用该函数的wedgeprops参数设置环状的宽度。在Python IDLE Shell窗口输入下面的语句行:
>>> 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。