Matplotlib包是Python进行数据可视化最基础的一个包,也是最核心的一个包,后面将要介绍的Seaborn包和pandas包中的绘图功能都是在Matplotlib包的基础上进一步开发的。本节介绍Matplotlib包最基础的绘图功能,包括坐标系的设置,点、线、面和文本等的设置。介绍几种常用类型图表的绘制。[大谦Excel,dqexcel点com]
在Excel内置Python中使用Matplotlib包绘图
下面利用图7-1所示工作表单元格区域A1:C5中的数据绘复合线形图。在D1单元格中输入“PY(”,进入Python模式。然后在公式栏中输入绘图代码。
首先导入matplotlib.pyplot子包,别名为plt。注意,Excel内置Python中可以直接使用plt表示matplotlib.pyplot,所以这一行代码可以省略。
import matplotlib.pyplot as plt
引用单元格区域A1:C5中的数据,返回给DataFrame类型的变量df。
df=xl("A1:C5",headers=True)
利用行数据连续绘制线形图,颜色分别为红色、绿色、兰色和黄色。
plt.plot(df.columns[1:3],df.iloc[0,1:3],'r')
plt.plot(df.columns[1:3],df.iloc[1,1:3],'g')
plt.plot(df.columns[1:3],df.iloc[2,1:3],'b')
plt.plot(df.columns[1:3],df.iloc[3,1:3],'y')
图7-1 在Excel内置Python中使用Matplotlib绘图
在公式栏中单击Ctrl+Enter键,单元格D1中返回一个Image对象。显示该对象,合并单元格区域E1:H11,显示复合线形图如图7-1所示。
进行更多的测试,在Python IDE中使用Matplotlib包绘过图的不难发现,在Excel内置Python中用Matplotlib包绘图有几点不同:
- 在Excel内置Python中用Matplotlib包可以直接使用别名plt,不用再导入。
- 数据的引用方式不同。
- 不用创建绘图窗体。
- 最后不必用语句plt.show()显示图表。
- Excel内置Python中不支持中文。
坐标系:设置坐标轴标题
坐标系是组成图表的核心要素,坐标系确定以后,坐标系中每个点、每条线、每个面的位置、大小、长度、角度、方向等才能确定,它是一个参照系。绘图时与坐标系有关的元素包括坐标轴、坐标轴标题、刻度线、网格线等。
Matplotlib包使用xlabel函数和ylabel函数设置x轴和y轴的标题。图7-1中线形图坐标轴没有标题,添加标题。7-2所示工作表中,单元格D1在Python模式下,在公式栏输入下面的代码:
df=xl("A1:C5",headers=True)
plt.plot(df.columns[1:3],df.iloc[0,1:3],'r')
plt.plot(df.columns[1:3],df.iloc[1,1:3],'g')
plt.xlabel('Year',fontsize=18) #设置x轴标签
plt.ylabel('Sales Volume',fontsize=18) #设置y轴标签
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域E1:H11,显示设置效果如图7-2所示。
图7-2 设置坐标轴标题
坐标系:设置刻度线
默认时Matplotlib包绘制的图表是有刻度线和刻度标签的。图7-2中,线形图的刻度标签字体过小,字看不清楚,将字体大小设置为16磅。Matplotlib包使用xticks函数和yticks函数设置x轴和y轴的刻度标签。调用minorticks_on函数和minorticks_off函数设置显示或不显示次级刻度线。单元格D1在Python模式下,在公式栏输入下面的代码:
df=xl("A1:C5",headers=True)
plt.plot(df.iloc[:,0],df.iloc[:,1],'r')
plt.minorticks_on() #显示次级刻度线
labels=['January','February','March','April']
plt.xticks(df.iloc[:,0],labels,fontsize=16) #设置x轴刻度标签
plt.yticks(fontsize=16) #设置y轴刻度标签字体大小为16磅
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域E1:H11,显示设置效果如图7-3所示。
图7-3 设置刻度线
坐标系:设置坐标轴取值范围
Matplotlib包使用xlim函数和ylim函数设置x轴和y轴的取值范围,一般是对数值轴进行此项设置。图7-4所示工作表中,单元格D1在Python模式下,在公式栏输入下面的代码,将y轴的取值范围设置在150000和280000之间:
df=xl("A1:C5",headers=True)
plt.plot(df.columns[1:3],df.iloc[0,1:3],'r')
plt.plot(df.columns[1:3],df.iloc[1,1:3],'g')
plt.ylim(150000,280000)
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域E1:H11,显示设置效果如图7-4所示。
图7-4 设置坐标轴取值范围
可以使用下面的语句同时设置x轴和y轴的取值范围。列表中,前面两个元素表示x轴的最小值和最大值,后面两个元素表示y轴的最小值和最大值。
plt.axis([1,10,1,10])
下面的语句将坐标轴设置为紧凑形式和等比例形式。
plt.axis('tight')
plt.axis('equal')
坐标系:设置网格线
Matplotlib包使用grid函数设置x轴和y轴刻度对应的网格线。图7-5所示工作表中,单元格D1在Python模式下,在公式栏输入下面的代码,显示两个坐标轴主刻度和次刻度对应的网格线,网格线用点线表示:
df=xl("A1:C5",headers=True)
plt.plot(df.iloc[:,0],df.iloc[:,1],'r')
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
plt.grid(visible=True,which='both',axis='both',linestyle=':')
图7-5 设置网格线
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域E1:H11,显示设置效果如图7-5所示。grid函数的参数which设置针对主网格还是次网格,或者二者都针对,可取的值包括‘major’,’minor’和’both’;axis参数设置针对x轴还是y轴,或者二者都针对,可取的值包括‘both’,’x’和’y’。
坐标系:设置坐标轴比例
Matplotlib包使用loglog函数、semilogx函数和semilogy函数绘制双对数坐标图、x半对数坐标图和y半对数坐标图。图7-6所示工作表中,单元格D1在Python模式下,在公式栏输入下面的代码,绘制y半对数坐标图:
df=xl("A1:B5",headers=True)
plt.semilogy(df.iloc[:,0],df.iloc[:,1],'r')
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
plt.minorticks_on()
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域E1:H11,显示设置效果如图7-6所示。注意图中纵轴主刻度采用对数间隔。
图7-6 设置坐标轴比例
坐标系:多轴图
Matplotlib包使用坐标轴对象的twinx方法和twiny方法绘制共用x轴和共用y轴的双轴图,即一个图中可以绘制两个具有不同坐标系的图表。图7-7所示工作表中,单元格B1在Python模式下,在公式栏输入下面的代码,绘制共用x轴的双轴图:
t=np.arange(0,7,0.1)
y1=np.exp(t)
y2=np.cos(t)
r=plt.subplots()
ax1=r[1] #左y轴
ax1.plot(t,y1,'r') #绘图
ax2=ax1.twinx() #生成右y轴
ax2.plot(t,y2,'g') #绘图
#设置三个坐标轴刻度标签的字体大小
ax1.set_xticklabels(ax1.get_xticklabels(),fontsize=16)
ax1.set_yticklabels(ax1.get_yticklabels(),fontsize=16)
ax2.set_yticklabels(ax2.get_yticklabels(),fontsize=16)
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域C1:F11,显示设置效果如图7-7所示。图中指数曲线使用左边的纵轴,余弦曲线使用右边的纵轴。
图7-7 多轴图
设置点图元的属性
再复杂的图表也是由基本的点、线、面和文本等图形元素组合而成,所以,进入图表绘制之前,有必要搞清Matplotlib包怎样绘制和设置这些基本图形元素。本小节首先介绍点图元的属性设置。点图元的属性包括点的标记类型、点的大小、点的背景颜色和边线颜色等。
颜色设置
点的颜色的设置可以有多种方法,常用颜色名称指定、用RGB分量进行指定或用十六进制整数指定。
用颜色名称指定,可以用名称的全称,也可以用名称的简称,例如指定颜色为绿色,可以使用名称‘green’或‘g’,前者为全称,后者为简称。用颜色名称指定颜色如表7-1所示。
表7-1 指定颜色名称
| 颜 色 | 全 称 | 简 称 |
|---|---|---|
| 红色 | 'red' | 'r' |
| 绿色 | 'green' | 'g' |
| 兰色 | 'blue' | 'b' |
| 青色 | 'cyan' | 'c' |
| 品红色 | 'magenta' | 'm' |
| 黄色 | 'yellow' | 'y' |
| 黑色 | 'black' | 'k' |
| 白色 | 'white' | 'w' |
使用RGB分量或RGBA分量指定颜色,即使用颜色的红色、绿色、兰色分量或者加上透明度来定义颜色。各分量的取值范围为0-1,一起放在一个元组中赋给参数或变量。例如(1.0, 0.0, 0.0)定义红色,(1.0, 1.0, 0.0)定义黄色,(0.1, 0.2, 0.5, 0.3)加上了透明度0.3。透明度取0时表示不透明,取1时表示完全透明。
使用十六进制整数指定颜色,实际上也是通过指定颜色的RGB分量指定颜色。例如‘#FF0000’表示红色。”#”号后面有六位数字,从前往后每两位表示的十六进制数表示一种颜色分量,共计红色、绿色和兰色三种颜色分量。各分量的最小值为00,最大值为FF。
除了上面用得最多的三种表示方式外,Matplotlib包还有其他一些表示颜色的方法。比如将颜色指定为一个0和1之间的小数,表示某种灰阶的灰色。其中0对应黑色,1对应白色。比如元组('green', 0.3)指定颜色为绿色,同时指定透明度为0.3。
常用三角形、菱形、圆形等面来表示点,着色时可以分别设置面的填充色和面的边线的颜色。Matplotlib中常用color参数设置面的填充色,用markeredgecolor参数设置面的边线的颜色。
标记类型的设置
图表中用图形表示点,可以有不同的标记类型,比如可以用空心圆或实心圆表示点、用星号表示点或者用三角形表示点等。
Matplotlib中将markerstyle参数指定为下面的值,设置对应的标记类型。
'.', 'o', 'v', '^', '<', '>', '8', 's', 'p', '*', 'h', 'H', 'D', 'd', 'P', 'X'
标记大小的设置
- Matplotlib中通过给markersize参数指定一个整数来表示标记的大小,单位为磅。
示例
图7-8所示工作表中,单元格A7在Python模式下,在公式栏输入下面的代码,用2020年的销售数据绘制点图:
df=xl("A1:C5",headers=True)
plt.plot(df.iloc[:,0],df.iloc[:,1],'ro')
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域B7:E15,显示设置效果如图7-8中左图所示。注意,用plot函数绘制点图时,前两个参数指定各点的x坐标和y坐标,第三个参数的值'ro'是一种快速赋点线属性值的方法。其中'r'表示点的填充色为红色,'o'表示点的标记类型为实心圆。
单元格F7在Python模式下,在公式栏输入下面的代码,用2020年的销售数据用不同的样式绘制点图:
df=xl("A1:C5",headers=True)
plt.plot(df.iloc[:,0],df.iloc[:,1],'b*',markersize=16,markeredgecolor='r')
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域G7:J15,显示设置效果如图7-8中右图所示。代码中用plot函数绘制点图时,用'b*'指定点的颜色为兰色,点标记为星号。用markersize参数设置标记的大小为16磅,用markeredgecolor参数设置点的边线颜色为红色。
图7-8 设置点图元的属性
设置线形图元的属性
图表中的线形图元包括直线、折线、坐标轴、刻度线、网格线、面的边线和图例中的线等。线形图元的属性包括线的颜色、线宽和线型等。
线的颜色的设置与5.1.8小节介绍的点的颜色的设置方法相同,请参阅。
- 线可以有不同的宽度,Matplotlib中通过给linewidth参数指定一个整数来表示线宽,单位为磅。
线可以有实线、虚线等表示方法,称为线型。Matplotlib中通过给linestyle参数指定一个字符串值来表示线型。线型可设置的值如表7-2所示,可以用名称设置,也可以用线型表示设置。
表7-2 线型设置
| 线 型 | 名称表示 | 线型表示 |
|---|---|---|
| 实线 | ‘solid’ | ‘-’ |
| 虚线 | ‘dashed’ | ‘--’ |
| 点虚线 | ‘dashdot’ | ‘-.’ |
| 点线 | ‘dotted’ | ‘:’ |
图7-9所示工作表中,单元格A7在Python模式下,在公式栏输入下面的代码,用2020年的销售数据绘制线形图:
df=xl("A1:C5",headers=True)
plt.plot(df.iloc[:,0],df.iloc[:,1],'r-.o')
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域不7:E15,显示设置效果如图7-9中右图所示。代码中用plot函数绘制线形图时,用'r-.o'指定线的颜色为红色,线型为实线,线上的点标记为实心圆。
单元格F7在Python模式下,在公式栏输入下面的代码,用2020年的销售数据用另外的样式绘制线形图:
df=xl("A1:C5",headers=True)
plt.plot(df.iloc[:,0],df.iloc[:,1],'r-.*',linestyle='-',linewidth=3,color='g',markersize=16)
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域G7:J15,显示设置效果如图7-9中右图所示。代码中用plot函数绘制线形图时,用'r-.*'指定线的线型为点虚线,点标记类型为星号。用linestyle参数设置线型为实线,用linewidth参数设置线宽为3磅,用color参数设置线的颜色为绿色,用markersize参数设置点标记的大小为16磅。为了演示设置方法,部分操作有重复。
图7-9 设置线形图元的属性
设置面图元的属性
图表中的面图元包括点标记的填充面、柱状图中的柱形面、饼图中的扇面、绘图区所在的面、图例所在的面等等。面的属性包括面的颜色和透明度等。
Matplotlib中通过color参数指定面的颜色,用edgecolor参数指定面的边线的颜色,用linewidth参数指定边线的线宽,用alpha参数指定透明度。
图7-10所示工作表中,单元格A7在Python模式下,在公式栏输入下面的代码,用2020年的销售数据绘制柱状图:
df=xl("A1:C5",headers=True)
plt.bar(df.iloc[:,0],df.iloc[:,1])
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域不7:E15,显示设置效果如图7-10中左图所示。默认时柱状图中的柱形面是兰色的。
单元格F7在Python模式下,在公式栏输入下面的代码,用2020年的销售数据用另外的样式绘制柱状图:
df=xl("A1:C5",headers=True)
plt.bar(df.iloc[:,0],df.iloc[:,1],color='g',edgecolor='r',linewidth=3,alpha=0.5)
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域A7:E15,显示设置效果如图7-10中右图所示。代码中用bar函数绘制柱状图时,用color参数指定面的颜色为绿色,用edgecolor参数指定面的边线的颜色为红色,用linewidth参数指定边线的线宽为3磅,用alpha参数指定透明度为0.5。
图7-10 设置面图元的属性
设置文本的属性
文本也是最常见的图表组成元素之一,各种标题、标签等都需要用文本来表示。文本的属性包括文本的位置、内容、背景色和文本字符串的字体属性,如字的字体、大小、颜色、是否加粗、是否倾斜等。Matplotlib中可使用text函数绘制文本。
图7-11所示工作表中,单元格D1在Python模式下,在公式栏输入下面的代码,用2020年的销售数据绘制线形图,并添加文本:
df=xl("A1:C5",headers=True)
plt.plot(df.iloc[:,0],df.iloc[:,1],'r-o')
#添加文本
plt.text('FEB',200000,'Text',fontfamily='fantasy',fontsize=20,\
fontweight=True,fontstyle='italic',backgroundcolor=(1,1,0))
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域E1:H10,显示设置效果如图7-11所示。代码中用text函数绘制文本时,前面两个参数指定文本的x坐标和y坐标,第三个参数指定文本的内容。用fontfamily参数指定字体名称,用fontsize参数指定字体大小为20磅,用fontweight参数指定字体是否加粗,值为True表示加粗,用fontstyle参数指定值为'italic',字体倾斜显示,用backgroundcolor参数指定文本的背景色为黄色。
图7-11 设置文本的属性
设置图表标题、数据标签和图例
除了前面介绍的点、线、面、文本等基本图形元素外,组成图表的还有图表标题、数据标签和图例等图表元素。
Matplotlib中用title函数创建图表标题,可以设置标题的内容和字体属性。用legend函数创建图例,可指定图例的标签、位置和字体属性等。添加数据标签,用text函数在各数据点的位置绘制对应数据即可。
图7-12所示工作表中,单元格D1在Python模式下,在公式栏输入下面的代码,用2020年和2021年的销售数据绘制复合线形图,并添加图表标题、数据标签和图例:
df=xl("A1:C5",headers=True)
plt.plot(df.iloc[:,0],df.iloc[:,1],'r-o')
plt.plot(df.iloc[:,0],df.iloc[:,2],'g-*')
plt.title(label='Sales In 2020-2021',fontsize=20) #添加图表标题
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
lbs=df.columns[1:3]
plt.legend(labels=lbs,loc='upper left',fontsize=16) #添加图例
for i in range(4): #添加数据标签
plt.text(df.iloc[i,0],df.iloc[i,1],\
df.iloc[i,1],va='top',fontsize=16)
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域E1:H10,显示设置效果如图7-12所示。
图7-12 设置图表标题、数据标签和图例
点图和线形图
5.1.8小节绘制了点图,用plot函数绘图时如果不指定线型,将会绘制数据点的图形,不绘制点之间的连线。
5.1.9小节和5.1.10小节绘制了简单线形图,5.1.12小节绘制了复合线形图,这里不再赘述。
柱状图
柱状图用一组或几组不同高度的矩形面表示数据的大小。相对于点图和线形图,柱状图的形象更加饱满。5.1.11小节用bar函数绘制了简单柱状图,并改变了柱形面的颜色、透明度以及边线的颜色和宽度。
下面用Matplotlib绘制两种复合柱状图。分别如图7-13中左图和右图所示。都是两个序列的柱形图,左边的重叠显示,右边的并排显示。
图7-13所示工作表中,单元格A7在Python模式下,在公式栏输入下面的代码,用2020年和2021年的销售数据绘制重叠复合柱状图:
df=xl("A1:C5",headers=True)
#绘制第1组柱状图
plt.bar(df.iloc[:,0],df.iloc[:,2],width=0.5,color='g')
#绘制第2组柱状图,更宽,半透明
plt.bar(df.iloc[:,0],df.iloc[:,1],width=0.8,color='b',alpha=0.6)
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
lbs=['Y2021','Y2020']
plt.legend(labels=lbs,loc='upper left',fontsize=16)
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域不7:E16,绘图效果如图7-13中左图所示。注意,Matplotlib绘制复合图表需要将多组图形一组一组地绘,如代码中用了两次bar函数绘2020年数据的柱状图和2021年数据的柱状图。第二组柱状图还是在原来的位置绘,但是柱形的宽度更宽了,并设置为半透明。
单元格F7在Python模式下,在公式栏输入下面的代码,用2020年和2021年的销售数据绘制并排显示的复合柱状图:
df=xl("A1:C5",headers=True)
t=np.array([1,2,3,4])
#绘制第1组柱状图
plt.bar(t,df.iloc[:,1],width=0.25,color='b')
#绘制第2组柱状图,同宽,位置+0.25,绿色
plt.bar(t+0.25,df.iloc[:,2],width=0.25,color='g')
ts=['JAN','FEB','MAR','APR']
plt.xticks(t+0.125,ts,fontsize=16)
plt.yticks(fontsize=16)
lbs=df.columns[1:3]
plt.legend(labels=lbs,loc='upper left',fontsize=16)
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域G7:J16,绘图效果如图7-13中右图所示。注意代码中为了达成并排显示两组柱条的效果,用bar函数绘制第二组柱状图的时候x坐标加上了0.25,0.25正是柱条的宽度。
图7-13 柱状图
面积图
面积图外观如图7-14中所示,用颜色填充的多边形区域表示数据的大小。Matplotlib包中用stackplot函数绘制面积图。根据给定数据的情况,可绘制简单面积图和复合面积图。
图7-14所示工作表中,单元格A7在Python模式下,在公式栏输入下面的代码,用2020年的销售数据绘制简单面积图:
df=xl("A1:C5",headers=True)
plt.stackplot(df.iloc[:,0],df.iloc[:,1],color='y')
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域B7:E16,绘图效果如图7-14中左图所示。
单元格F7在Python模式下,在公式栏输入下面的代码,用2020年和2021年的销售数据绘制复合面积图:
df=xl("A1:C5",headers=True)
plt.stackplot(df.iloc[:,0],df.iloc[:,1],df.iloc[:,2])
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域G7:J16,绘图效果如图7-14中右图所示。
图7-14 面积图
饼图
饼图是常见的图表类型,用来表示数据占总体的百分比最合适。Matplotlib包用pie函数绘制饼图。根据绘图数据的组数,可以绘制简单饼图和复合环状图。
图7-15所示工作表中,单元格区域A1:C6中为某影院星期一和星期二几部影片的票房数据。单元格A8在Python模式下,在公式栏输入下面的代码,用星期一的票房数据绘制简单饼图:
df=xl("A1:B6",headers=True)
plt.pie(df.iloc[:,1],labels=df.iloc[:,0],explode=[0,0.2,0,0,0])
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域B8:D16,绘图效果如图7-15中左图所示。代码中pie函数的第一个参数指定绘图数据,用labels参数指定标签数据,用explode参数指定分离的扇区。给explode参数指定一个列表,列表中的元素表示每个扇区的分离情况,不分离时值为0,分离时值非0,为0-1的小数,表示分离的距离,用分离距离与饼图半径的百分比表示。
单元格E8在Python模式下,在公式栏输入下面的代码,用星期一和星期二的票房数据绘制复合环状图:
df=xl("A1:C6",headers=True)
plt.pie(df.iloc[:,1],radius=1,labels=df.iloc[:,0],wedgeprops=dict(width=0.3,edgecolor='w'))
plt.pie(df.iloc[:,2],radius=1-0.3,labels=df.iloc[:,0],wedgeprops=dict(width=0.3,edgecolor='w'))
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域F8:I16,绘图效果如图7-15中右图所示。代码中两次使用pie函数,分别绘制星期一票房数据和星期二票房数据对应的环状图。pie函数的wedgeprops参数指定环的宽度占圆半径的30%,边线的颜色为白色。
图7-15 饼图
散点图
散点图各坐标轴一般都是数值轴,用一组坐标定义空间中的一组点。散点图可表现一组点的分布特征,曲线拟合、残差分析等常常使用。Matplotlib包中用scatter函数绘制散点图。注意,散点图和5.1.8小节介绍的点图是完全不一样的。点图的横坐标轴一般为分类轴。
图7-16所示工作表中,A列和B列为给定的一组测量值。单元格D2在Python模式下,在公式栏输入下面的代码,用给定的数据绘制散点图:
df=xl("A1:B45",headers=True)
plt.scatter(df.iloc[:,0],df.iloc[:,1],marker='*')
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域E2:I13,绘图效果如图7-16所示。代码中scatter函数的前两个参数指定绘图数据,marker参数指定点的标记类型。
图7-16 散点图
直方图
直方图用一组柱形表现一组一维数值型数据的分布特征。绘制直方图时,先将给定的数据从小到大排序,然后按照相等的间隔对数据进行分箱,最后统计全部数据落在各分箱内的个数并根据个数绘制对应长度的柱形。用直方图可以直观地看出数据主要集中在哪一段。Matplotlib包中用hist函数绘制直方图。
图7-17所示工作表中,A列为女孩身高数据,B列为辐射测量数据,在第6章用来进行了正态分布检验。单元格D1在Python模式下,在公式栏输入下面的代码,用A列数据绘制直方图:
df=xl("A1:A21",headers=True)
plt.hist(df.iloc[:,0])
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域E1:H10,绘图效果如图7-17中上图所示。直方图显示数据在中间比较集中,明显呈现正态分布。
单元格E12在Python模式下,在公式栏输入下面的代码,用B列数据绘制直方图:
df=xl("B1:B43",headers=True)
plt.hist(df.iloc[:,0],bins=20,color='g')
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域E12:H21,绘图效果如图7-17中下图所示。直方图显示数据在左侧比较集中,明显呈现对数正态分布。代码中hist函数中用bins设置分箱数为20,所以直方图中对应有20个柱形,用color参数设置颜色为绿色。
图7-17 直方图
等值线图
等值线图用二维图表表现三维曲面数据的分布特征。它是将三维曲面数据中的z坐标值从下往上按照一定的间隔进行获取,然后将曲面上当前z值相等的点依次连接成等值线,并投影到二维平面。各组z值对应的投影线最后组合成等值线图。Matplotlib包用contour函数绘制等值线图,用contourf函数绘制填充等值线图。
图7-18所示工作表中,单元格A2在Python模式下,在公式栏输入下面的代码,绘制三维函数Z=sin(X)*cos(Y)定义的等值线图。先用x和y在-5到5范围内每隔0.25取一个值,根据x和y利用meshgrid函数得到X和Y,它们是两个大小相同的二维矩阵。Z值用X和Y利用给定函数通过矢量运算得到。最后利用contour函数绘等值线图:
x=np.arange(-5,5,0.25)
y=np.arange(-5,5,0.25)
X,Y=np.meshgrid(x,y) #用meshgrid函数获取平面网格数据
Z=np.sin(X)*np.sin(Y) #计算Z值
plt.contour(X,Y,Z,levels=10) #绘等值线图
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域B2:E11,绘图效果如图7-18中左图所示。
单元格F2在Python模式下,在公式栏输入下面的代码,绘制填充等值线图:
plt.contourf(X,Y,Z,levels=10)
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域G2:J11,绘图效果如图7-18中右图所示。
图7-18 等值线图
矢量图
矢量图可以表现二维或三维矢量场的特征。对于二维矢量图,绘制时需要知道二维网格节点上每个点的x坐标和y坐标,还要知道该点处在x方向和y方向的矢量。Matplotlib包用quiver函数绘制矢量图。
图7-19所示工作表中,单元格A2在Python模式下,在公式栏输入下面的代码,绘制三维函数Z=sin(X)*cos(Y)定义的等值线图。先用x和y在-5到5范围内每隔0.5取一个值,根据x和y利用meshgrid函数得到X和Y,它们是两个大小相同的二维矩阵。Z值用X和Y利用给定函数通过矢量运算得到。U和V定义各点处x方向和y方向的梯度,它们是矢量,利用Z矩阵,用gradient函数计算得到。最后利用quiver函数绘矢量图:
x=np.arange(-5,5,0.5)
y=np.arange(-5,5,0.5)
X,Y=np.meshgrid(x,y)
Z=np.sin(X)*np.sin(Y)
U,V=np.gradient(Z)
plt.quiver(X,Y,U,V)
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域B2:E11,绘图效果如图7-19中左图所示。
单元格F2在Python模式下,在公式栏输入下面的代码,绘制等值线图,然后叠加矢量图:
x=np.arange(-5,5,0.5)
y=np.arange(-5,5,0.5)
X,Y=np.meshgrid(x,y)
Z=np.sin(X)*np.sin(Y)
U,V=np.gradient(Z) #求x和y方向的梯度
plt.contour(X,Y,Z,levels=10) #绘等值线图
plt.quiver(X,Y,U,V) #叠加矢量图
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域F2:J11,绘图效果如图7-19中右图所示。
图7-19 矢量图
三维曲线和曲面
前面绘制的都是二维图形,Matplotlib包还可以绘制三维曲线图和三维曲面图。绘制三维图需要使用三维坐标系。使用下面的语句建立三维坐标系。
ax=plt.figure().add_subplot(projection='3d')
下面在图7-20所示工作表中绘制三维螺旋曲线,使用参数方程定义螺旋曲线。
x=r* cos(theta)
y=r* sin(theta)
z=1.2*theta
其中r是半径,theta是旋转角度,1.2是指定的增长率,x,y,z为曲线上点的坐标值。按顺序连接各点即得到三维螺旋曲线。
单元格A2在Python模式下,在公式栏输入下面的代码,绘制螺旋曲线。
ax=plt.figure().add_subplot(projection='3d')
theta=np.linspace(-3*np.pi,3*np.pi,100)
r=10
x=r*np.cos(theta)
y=r*np.sin(theta)
z=1.2*theta
ax.plot(x,y,z) #绘三维曲线
ax.set_xticklabels(labels=ax.get_xticklabels(),fontsize=16)
ax.set_yticklabels(labels=ax.get_yticklabels(),fontsize=16)
ax.set_zticklabels(labels=ax.get_zticklabels(),fontsize=16)
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域B2:E11,绘图效果如图7-20中左图所示。代码中,绘曲线使用坐标系对象的plot方法。最后三行设置三个坐标轴上刻度标签的字体大小为16磅。
单元格F2在Python模式下,在公式栏输入下面的代码,绘制三维函数Z=sin(X)*cos(Y)定义的曲面图:
ax=plt.figure().add_subplot(projection='3d')
x=np.arange(-5,5,0.25)
y=np.arange(-5,5,0.25)
X,Y=np.meshgrid(x,y)
Z=np.sin(X)*np.sin(Y)
ax.plot_surface(X, Y, Z) #绘三维曲面
ax.set_xticklabels(labels=ax.get_xticklabels(),fontsize=16)
ax.set_yticklabels(labels=ax.get_yticklabels(),fontsize=16)
ax.set_zticklabels(labels=ax.get_zticklabels(),fontsize=16)
在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域F2:J11,绘图效果如图7-20中右图所示。代码中使用坐标系对象的plot_surface方法绘三维曲面图。
图7-20 三维曲线和曲面