本文来自《超简单 利用python让excel飞起来》
121 制作柱形图(方法一)
柱形图通常用于直观地对比数据,在实际工作中使用频率很高。在Python中,可使用Matplotlib模块中的bar()函数制作简单的柱形图。
import matplotlib.pyplot as plt
plt.figure( figsize= ( 10,4 ))
x = [ '1月' ,'2月' ,'3月' ,'4月' ,'5月' ,'6月' ,'7月' ,'8月' ,'9月' ,'10月' ,'11月' ,'12月' ]
y = [ 100,90 ,88,70,66,50,40,55,56,88,95,98]
plt.bar( x,y,width= 0.5 ,align= 'center' ,color= 'k' )
plt.rcParams[ 'font.sans-serif' ] = [ 'Microsoft YaHei' ]
plt.rcParams[ 'axes.unicode_minus' ] = False
plt.show( )
第5行代码用于根据给出的数据制作柱形图,并对柱子的粗细、位置和填充颜色进行设置,这些设置读者可根据实际需求修改。如果想要制作条形图,将这行代码中的“bar”修改为“barh”即可。 第6行和第7行代码为图表中的文本设置字体,并解决当坐标值为负数时的显示问题,让制作出的图表能正常显示数据和文本内容 第8行代码用于在一个窗口中显示制作的柱形图 (1)第1行代码导入的Matplotlib是Python的一个数据可视化模块,其子模块pyplot包含大量用于绘制各类图表的函数。(2)第2行代码中的figure()是pyplot子模块中的函数,用于创建一个绘图窗口。函数的参数figsize用于设置窗口的宽度和高度,单位为英寸(1英寸=0.0254米)。例如,“figsize=(10,4)”表示创建一个宽10英寸、高4英寸的绘图窗口。(3)第5行代码中的bar()是pyplot子模块中的函数,用于制作柱形图。该函数的第1个和第2个参数分别用于设置x坐标的值和y坐标的值。 参数width用于设置柱子的宽度,其值并不表示一个具体的尺寸,而是表示柱子的宽度在图表中所占的比例,默认值为0.8。如果设置为1,则各个柱子会紧密相连;如果设置为大于1的数,则各个柱子会相互交叠。 参数align用于设置柱子的位置与x坐标的关系。默认值为’center’,表示柱子与x坐标居中对齐;如果设置为’edge’,表示柱子与x坐标左对齐。 参数color用于设置柱子的填充颜色,本案例代码中的’k’表示黑色。Matplotlib模块支持多种格式的颜色,这里先介绍最常用的一种颜色格式——用颜色名英文单词的简写定义的8种基础颜色,具体见下表。 (4)第6行代码中的“Microsoft YaHei”是微软雅黑字体的英文名称,如果想要使用其他中文字体,可参考下面的字体名称中英文对照表。 运行结果
122 制作柱形图(方法二)
案例121使用Matplotlib模块制作了简单的柱形图,本案例则要使用pyecharts模块来制作柱形图。
from pyecharts.charts import Bar
x = [ '1月' ,'2月' ,'3月' ,'4月' ,'5月' ,'6月' ,'7月' ,'8月' ,'9月' ,'10月' ,'11月' ,'12月' ]
y = [ 100,90 ,88,70,66,50,40,55,56,88,95,98]
chart = Bar( )
chart.add_xaxis( x)
chart.add_yaxis( '销售量' ,y)
chart.render( '柱形图.html' )
第4行代码用于创建一个空白柱形图。第5行代码用于为图表添加x坐标的值。第6行代码用于为图表添加y坐标的值,并指定系列名称为“销售量”。 第7行代码用于将制作的图表保存为网页文件,这里使用相对路径,将文件保存在代码文件所在文件夹下,文件名为“柱形图.html”。读者可根据实际需求修改文件路径。 运行结果如下
123 制作折线图
折线图常用于显示一段时间内的数据变化趋势。使用Matplotlib模块中的plot()函数可绘制折线图。
import matplotlib.pyplot as plt
plt.figure( figsize= ( 10,4 ))
x = [ '1月' ,'2月' ,'3月' ,'4月' ,'5月' ,'6月' ,'7月' ,'8月' ,'9月' ,'10月' ,'11月' ,'12月' ]
y = [ 100,90 ,88,70,66,50,40,55,56,88,95,98]
plt.plot( x,y,color= 'k' ,linewidth= 3 ,linestyle= 'solid' ,marker= 's' ,markersize= 10 )
plt.rcParams[ 'font.sans-serif' ] = [ 'Microsoft YaHei' ]
plt.rcParams[ 'axes.unicode_minus' ] = False
plt.show( )
第5行代码用于根据给出的数据制作折线图,并对折线的颜色、粗细、线型以及数据标记的符号和大小进行设置,读者可根据实际需求修改这些设置。如果想要制作堆积面积图,将这行代码修改为“plt.stackplot(x,y,color=‘k’)”即可。 (2)第5行代码中的plot()是pyplot子模块中的函数,用于制作折线图。该函数的第1个和第2个参数分别用于设置x坐标和y坐标的数据。参数color用于设置折线的颜色,设置方法与案例121中bar()函数的参数color的设置方法相同,这里不再赘述。参数linewidth用于设置折线的粗细,单位为“点”。参数linestyle用于设置折线的线型,可取的值如下表所示。 参数marker用于设置折线图的数据标记,参数markersize则用于设置数据标记的大小。参数marker常用的取值如下表所示。 运行结果
124 制作饼图
饼图常用于展示各类别数据的占比。使用Matplotlib模块中的pie()函数可绘制饼图。
import matplotlib.pyplot as plt
plt.figure( figsize= ( 6,4 ))
x = [ '上海' ,'北京' ,'深圳' ,'重庆' ,'大连' ,'成都' ,'天津' ]
y = [ 120,150 ,88,70,96,50,40]
plt.pie( y,labels= x,labeldistance= 1.1 ,autopct= '%.2f%%' ,pctdistance= 1.5 ,counterclock= False,startangle= 90 ,explode= [ 0.3 ,0,0,0,0,0,0] )
plt.rcParams[ 'font.sans-serif' ] = [ 'Microsoft YaHei' ]
plt.rcParams[ 'axes.unicode_minus' ] = False
plt.show( )
第2行代码用于创建一个绘图窗口,读者可根据实际需求修改窗口的大小。 第3行和第4行代码用于指定制作饼图的数据,然后在第5行代码中使用pie()函数根据这些数据制作饼图,并将饼图中的第1个饼图块分离出来(读者可根据实际需求修改要分离的饼图块)。如果不分离饼图块,那么将第5行代码修改为“plt.pie(y,labels=x,labeldistance=1.1,autopct=’%.2f%%’,pctdistance=1.5,counterclock=False,startangle=90)”。 (1)第5行代码中的pie()是pyplot子模块中的函数,用于制作饼图。该函数的第1个参数是饼图块的数据系列值。参数labels用于设置每一个饼图块的数据标签内容。参数labeldistance用于设置每一个饼图块的数据标签与饼图块中心的距离。参数autopct用于设置饼图块的百分比数值的格式。参数pctdistance用于设置百分比数值与饼图块中心的距离。参数counterclock用于设置各个饼图块是逆时针排列还是顺时针排列,为False时表示顺时针排列,为True时表示逆时针排列。参数startangle用于设置第1个饼图块的初始角度,这里设置为90°。参数explode用于设置每一个饼图块与圆心的距离,其值通常是一个列表,列表的元素个数与饼图块的数量相同。本案例将参数explode设置为[0.3,0,0,0,0,0,0],第1个元素为0.3,其他元素均为0,表示将第1个饼图块(上海)分离,其他饼图块的位置不变。 (2)如果想要使用pie()函数制作圆环图,可通过设置该函数的参数wedgeprops来实现。例如,将第5行代码修改为如下代码:
plt.pie( y,labels= x,labeldistance= 1.1 ,autopct= '%.2f%%' ,pctdistance= 1.5 ,counterclock= False,startangle= 90 ,wedgeprops= { 'width' :0.3,'linewidth' :2,'edgecolor' : 'w' } )
参数wedgeprops用于设置饼图块的属性,其值为一个字典,字典中的元素则是饼图块各个属性的名称和值的键值对。上面这行代码将wedgeprops设置为{‘width’:0.3,‘linewidth’:2,‘edgecolor’:‘w’},表示设置饼图块的环宽(圆环的外圆半径减去内圆半径)占外圆半径的比例为0.3,边框粗细为2,边框颜色为白色。将饼图块的环宽占比设置为小于1的数(这里为0.3),就能绘制出圆环图。 运行结果
125 添加图表标题和图例
图表标题和图例是增强图表可读性必不可少的元素。本案例以柱形图为例,介绍添加图表标题和图例的方法。
import matplotlib.pyplot as plt
plt.figure( figsize= ( 10,4 ))
x = [ '1月' ,'2月' ,'3月' ,'4月' ,'5月' ,'6月' ,'7月' ,'8月' ,'9月' ,'10月' ,'11月' ,'12月' ]
y = [ 100,90 ,88,70,66,50,40,55,56,88,95,98]
plt.bar( x,y,width= 0.5 ,align= 'center' ,color= 'k' ,label= '销售量(台)' )
plt.legend( loc= 'best' ,fontsize= 12 )
plt.title( label= '销售对比图' ,fontdict= { 'family' : 'KaiTi' ,'color' : 'k' ,'size' :25} ,loc= 'center' )
plt.rcParams[ 'font.sans-serif' ] = [ 'Microsoft YaHei' ]
plt.rcParams[ 'axes.unicode_minus' ] = False
plt.show( )
第3行和第4行代码分别给出图表的x坐标和y坐标的数据。第5行代码用于根据给出的数据制作柱形图,并对柱子的粗细、位置和填充颜色进行设置,读者可根据实际需求修改这些设置。 第6行代码用于为图表添加并设置图例。需要注意的是,应先在第5行代码的bar()函数中设置图例标签内容(这里设置为“销售量(台)”,读者可根据实际需求修改),再在第6行代码中设置图例的格式,才能在图表中显示正确的图例效果 第7行代码用于为图表添加图表标题,并对图表标题的字体格式和位置进行设置,读者可根据实际需求修改这些设置。 (1)第6行代码中的legend()是pyplot子模块中的函数,用于在图表中添加图例,图例的内容由相应的绘图函数决定。例如,第5行代码使用bar()函数制作柱形图,legend()函数添加的图例图形为矩形色块,图例标签为bar()函数的参数label的值。 legend()函数的参数loc用于设置图例的位置,取值可以为字符串或整型数字,具体如下表所示。需要注意的是,‘right’实际上等同于’center right’,这个值是为了兼容旧版本的Matplotlib模块而设立的。 (2)第7行代码中的title()是pyplot子模块中的函数,用于添加图表标题。参数label用于设置图表标题的文本内容;参数fontdict用于设置图表标题的文本格式,如字体、颜色、字号等;参数loc用于设置图表标题的位置,可取的值如下表所
126 添加数据标签
在图表上添加数据标签可让图表的数据展示更加直观。本案例以柱形图为例,介绍为图表添加数据标签的方法。
import matplotlib.pyplot as plt
plt.figure( figsize= ( 10,4 ))
x = [ '1月' ,'2月' ,'3月' ,'4月' ,'5月' ,'6月' ,'7月' ,'8月' ,'9月' ,'10月' ,'11月' ,'12月' ]
y = [ 100,90 ,88,70,66,50,40,55,56,88,95,98]
plt.bar( x,y,width= 0.5 ,align= 'center' ,color= 'k' ,label= '销售量(台)' )
for a,b in zip( x,y) :
plt.text( x= a,y= b,s= b,ha= 'center' ,va= 'bottom' ,fontdict= { 'family' : 'KaiTi' ,'color' : 'k' ,'size' :15} )
plt.rcParams[ 'font.sans-serif' ] = [ 'Microsoft YaHei' ]
plt.rcParams[ 'axes.unicode_minus' ] = False
plt.show( )
(1)第6行代码中的zip()是Python的内置函数,它以可迭代对象作为参数,将对象中对应的元素配对打包成一个个元组,然后返回由这些元组组成的列表。 (2)第7行代码中的text()是pyplot子模块中的函数,用于在图表的指定坐标位置添加文本。参数x和y分别用于设置文本的x坐标和y坐标;参数s用于设置文本的内容;参数ha是horizontal alignment的简写,表示文本在水平方向的位置,可取的值有’center’、‘right’、‘left’;参数va是vertical alignment的简写,表示文本在垂直方向的位置,可取的值有’center’、‘top’、‘bottom’、‘baseline’、‘center_baseline’;参数fontdict用于设置文本的字体格式。 text()函数每次只能添加一个文本,如果要给图表的所有数据点添加数据标签,则需配合使用循环。第6行代码使用for语句构造了一个循环,并使用zip()函数将列表x和y的元素逐个配对打包成一个个元组,即(‘1月’,100)、(‘2月’,90)、(‘3月’,88)……的形式,再通过循环变量a和b分别取出每个元组的元素,在第7行代码中传递给text()函数,用于添加数据标签。 运行结果
127 添加坐标轴标题
import matplotlib.pyplot as plt
plt.figure( figsize= ( 10,4 ))
x = [ '1月' ,'2月' ,'3月' ,'4月' ,'5月' ,'6月' ,'7月' ,'8月' ,'9月' ,'10月' ,'11月' ,'12月' ]
y = [ 100,90 ,88,70,66,50,40,55,56,88,95,98]
plt.bar( x,y,width= 0.5 ,align= 'center' ,color= 'k' ,label= '销售量(台)' )
plt.xlabel( '月份' ,fontdict= { 'family' : 'SimSun' ,'color' : 'k' ,'size' :12} ,labelpad= 2 )
plt.ylabel( '销售量(台)' ,fontdict= { 'family' : 'SimSun' ,'color' : 'k' ,'size' :12} ,labelpad= 2 )
plt.rcParams[ 'font.sans-serif' ] = [ 'Microsoft YaHei' ]
plt.rcParams[ 'axes.unicode_minus' ] = False
plt.show( )
第6行代码中的xlabel()和第7行代码中的ylabel()都是pyplot子模块中的函数,分别用于为图表添加x轴标题和y轴标题。这两个函数的第1个参数为标题的文本内容,参数fontdict用于设置标题的字体格式,参数labelpad用于设置标题与坐标轴的距离。 运行结果
128 添加网格线
使用Matplotlib模块制作的图表在默认情况下不显示网格线。本案例以折线图为例,介绍为图表添加网格线的方法。
import matplotlib.pyplot as plt
plt.figure( figsize= ( 10,4 ))
x = [ '1月' ,'2月' ,'3月' ,'4月' ,'5月' ,'6月' ,'7月' ,'8月' ,'9月' ,'10月' ,'11月' ,'12月' ]
y = [ 100,90 ,88,70,66,50,40,55,56,88,95,98]
plt.plot( x,y,color= 'k' ,linewidth= 3 ,linestyle= 'solid' ,marker= 's' ,markersize= 10 )
plt.grid( b= True,axis= 'both' ,color= 'r' ,linestyle= 'dotted' ,linewidth= 1 )
plt.rcParams[ 'font.sans-serif' ] = [ 'Microsoft YaHei' ]
plt.rcParams[ 'axes.unicode_minus' ] = False
plt.show( )
第6行代码中的grid()是pyplot子模块中的函数,用于为图表添加网格线。该函数的参数b设置为True时,表示显示网格线(默认同时显示x轴和y轴的网格线)。参数axis用于指定针对哪条坐标轴的网格线进行设置,默认值为’both’,表示同时设置x轴和y轴的网格线,设置为’x’或’y’时则分别表示只设置x轴或y轴的网格线。参数color、linestyle和linewidth分别用于设置网格线的颜色、线型和粗细。 运行结果
129 调整坐标轴的刻度范围
使用Matplotlib模块制作的图表在默认情况下会自动为坐标轴设置刻度范围。本案例以折线图为例,介绍自定义图表坐标轴刻度范围的方法。
import matplotlib.pyplot as plt
plt.figure( figsize= ( 10,4 ))
x = [ '1月' ,'2月' ,'3月' ,'4月' ,'5月' ,'6月' ,'7月' ,'8月' ,'9月' ,'10月' ,'11月' ,'12月' ]
y = [ 100,90 ,88,70,66,50,40,55,56,88,95,98]
plt.plot( x,y,color= 'k' ,linewidth= 3 ,linestyle= 'solid' )
plt.title( label= '销售趋势图' ,fontdict= { 'family' : 'KaiTi' ,'color' : 'k' ,'size' :25} ,loc= 'center' )
plt.ylim( 20,120 )
plt.rcParams[ 'font.sans-serif' ] = [ 'Microsoft YaHei' ]
plt.rcParams[ 'axes.unicode_minus' ] = False
plt.show( )
本案例的核心代码是第7行,用于为图表设置y轴的刻度范围,这里设置为20~120。读者可按照“知识延伸”的讲解,根据实际需求修改刻度范围。 (1)第7行代码中的ylim()是pyplot子模块中的函数,用于设置y轴的刻度范围,函数的两个参数分别为刻度的下限和上限。如果想单独设置y轴刻度的下限或上限,可使用参数bottom和top,相应代码如下: 设置x轴的刻度范围则要使用xlim()函数,通过参数left和right可分别单独设置下限和上限。 (2)使用pyplot子模块中的axis()函数可以切换坐标轴的显示和隐藏,相应代码如下: 运行结果
130 在一张画布中绘制多个图表
Matplotlib模块在绘制图表时,默认先建立一张画布,然后在画布中绘制图表。如果想要在一张画布中绘制多个图表,可使用subplot()函数将画布划分为多个区域,然后在各个区域中分别绘制不同的图表。
import matplotlib.pyplot as plt
plt.figure( figsize= ( 6,4 ))
x = [ '上海' ,'北京' ,'深圳' ,'重庆' ,'大连' ,'成都' ,'天津' ]
y = [ 120,150 ,88,70,96,50,40]
plt.subplot( 2,2 ,1)
plt.bar( x,y,width= 0.5 ,align= 'center' ,color= 'r' )
plt.subplot( 2,2 ,2)
plt.pie( y,labels= x,labeldistance= 1.1 ,autopct= '%.2f%%' ,pctdistance= 1.6 )
plt.subplot( 2,2 ,3)
plt.plot( x,y,color= 'r' ,linewidth= 3 ,linestyle= 'solid' )
plt.subplot( 2,2 ,4)
plt.stackplot( x,y,color= 'r' )
plt.rcParams[ 'font.sans-serif' ] = [ 'Microsoft YaHei' ]
plt.rcParams[ 'axes.unicode_minus' ] = False
plt.show( )
(1)第5、7、9、11行代码中的subplot()是pyplot子模块中的函数,用于将画布划分为多个区域,然后指定绘制图表的区域。subplot()函数的参数为3个整型数字:第1个数字代表将整张画布划分为几行;第2个数字代表将整张画布划分为几列;第3个数字代表要在第几个区域中绘制图表,区域的编号规则是按照从左到右、从上到下的顺序,从1开始编号。该函数的参数也可以写成一个3位的整型数字,如223。使用这种形式的参数时,划分画布的行数和列数均不能超过10。 (2)第12行代码中的stackplot()是子模块pyplot中的函数,用于制作堆积面积图。 运行结果
131 在一个工作表中插入图表
除了在绘图窗口中显示绘制的图表,还可以将绘制的图表插入工作表。如右图所示为工作簿“各月销售数量表.xlsx”的工作表“1月”中的销售数量数据,现要使用这些数据制作一个柱形图,并插入工作表中。
import pandas as pd
import matplotlib.pyplot as plt
import xlwings as xw
figure = plt.figure( figsize= ( 10,4 ))
data = pd.read_excel( '各月销售数量表.xlsx' ,sheet_name= '1月' )
x = data[ '配件名称' ]
y = data[ '销售数量' ]
plt.bar( x,y,width= 0.5 ,align= 'center' ,color= 'k' )
plt.rcParams[ 'font.sans-serif' ] = [ 'Microsoft YaHei' ]
plt.rcParams[ 'axes.unicode_minus' ] = False
app = xw.App( visible= False,add_book= False)
workbook = app.books.open( '各月销售数量表.xlsx' )
worksheet = workbook.sheets[ '1月' ]
worksheet.pictures.add( figure,left= 500 )
workbook.save( '各月销售数量表1.xlsx' )
workbook.close( )
第14行代码中的add()是xlwings模块中Pictures对象的一个函数,用于在工作表中插入图片。该函数的第1个参数可以是用Matplotlib模块制作的图表,也可以是图片文件的路径;参数left用于设置图片的左边距,如果要设置图片的顶边距,可以使用参数top。
132 在一个工作簿的所有工作表中插入图表
import pandas as pd
import matplotlib.pyplot as plt
import xlwings as xw
all_data = pd.read_excel( '各月销售数量表.xlsx' ,sheet_name= None)
app = xw.App( visible= False,add_book= False)
workbook = app.books.open( '各月销售数量表.xlsx' )
worksheet = workbook.sheets
for i in all_data:
figure = plt.figure( figsize= ( 10,4 ))
data = all_data[ i]
x = data[ '配件名称' ]
y = data[ '销售数量' ]
plt.bar( x, y, width = 0.5 , align = 'center' , color = 'k' )
plt.rcParams[ 'font.sans-serif' ] = [ 'Microsoft YaHei' ]
plt.rcParams[ 'axes.unicode_minus' ] = False
worksheet[ i] .pictures.add( figure,left= 500 )
workbook.save( '各月销售数量表1.xlsx' )
workbook.close( )
app.quit( )
133 制作散点图
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import linear_model
figure = plt.figure( figsize= ( 10,4 ))
data = pd.read_excel( '客户满意度.xlsx' ,sheet_name= 'Sheet1' )
x = data[ '收货天数(天)' ]
y = data[ '客户满意度' ]
plt.scatter( x,y,s= 100 ,marker= 'o' ,color= 'k' )
x1 = x.to_numpy( ) .reshape( -1,1)
model = linear_model.LinearRegression( ) .fit( x1,y)
y1 = model.predict( x1)
plt.plot( x,y1,color= 'k' ,linewidth= '3' ,linestyle= 'solid' )
plt.title( label= '收货天数与客户满意度关系图' ,fontdict= { 'family' : 'KaiTi' ,'color' : 'k' ,'size' :25} ,loc= 'center' )
plt.xlabel( '收获天数(天)' ,fontdict= { 'family' : 'SimSun' ,'color' : 'k' ,'size' :12} ,labelpad= 2 )
plt.ylabel( '客户满意度' ,fontdict= { 'family' : 'SimSun' ,'color' : 'k' ,'size' :12} ,labelpad= 2 )
plt.xlim( 0,22 .5)
plt.ylim( 0,12 )
plt.rcParams[ 'axes.unicode_minus' ] = False
plt.show( )
第9行代码先用to_numpy()函数将自变量数据转换为一维数组,再用reshape()函数将一维数组转换为二维数组。reshape()函数的两个参数分别表示二维数组的行数和列数。例如,reshape(3,4)表示转换为3行4列的二维数组。本案例的reshape(-1,1)中,-1表示不指定行数,而是根据数组的元素个数和列数自动计算行数,1则表示列数为1。
134 制作涟漪特效散点图
案例133使用Matplotlib模块中的scatter()函数制作散点图,本案例则要使用pyecharts模块中的EffectScatter()函数制作带有涟漪特效的散点图。
import pandas as pd
import pyecharts.options as opts
from pyecharts.charts import EffectScatter
data = pd.read_excel( '客户满意度.xlsx' ,sheet_name= 'Sheet1' )
x = data[ '收货天数(天)' ]
y = data[ '客户满意度' ]
chart = EffectScatter( )
chart.add_xaxis( x)
chart.add_yaxis( series_name= '收货天数(天),客户满意度' ,y_axis= y,label_opts= opts.LabelOpts( is_show= False) ,symbol_size= 15 )
chart.set_global_opts( title_opts= opts.TitleOpts( title= '收货天数与客户满意度散点图' ) ,yaxis_opts= opts.AxisOpts( type_= 'value' ,name_gap= 40 ) ,
tooltip_opts = opts.TooltipOpts( trigger= 'item' ,formatter= '{a}:{c}' ))
chart.render( '散点图.html' )
(1)第7行代码中的EffectScatter()是pyecharts模块的子模块charts中的函数,用于制作带有涟漪特效的散点图。 (2)在pyecharts模块中,用于配置图表元素的选项称为配置项。配置项分为全局配置项和系列配置项,这里主要介绍全局配置项。如果读者想了解配置项的更多知识,可以查阅pyecharts模块的官方文档,网址为https://pyecharts.org/#/zh-cn/global_options。 (2)在pyecharts模块中,用于配置图表元素的选项称为配置项。配置项分为全局配置项和系列配置项,这里主要介绍全局配置项。如果读者想了解配置项的更多知识,可以查阅pyecharts模块的官方文档,网址为https://pyecharts.org/#/zh-cn/global_options。 AxisOpts()为图表分别添加了y轴标题“客户满意度”和x轴标题“收货天数(天)”。该函数的参数type_用于设置坐标轴的类型,这里设置为’value’(数字轴),还可以设置为’category’(类目轴)、‘time’(时间轴)、‘log’(对数轴);参数name用于设置坐标轴标题的文本内容;参数name_location用于设置坐标轴标题相对于轴线的位置,这里设置为居中显示;参数name_gap用于设置坐标轴标题与轴线的间距,这里设置为40 px。 TooltipOpts()设置了图表的提示框,也就是将鼠标指针放在图表的数据系列上时弹出的提示信息。 运行结果
135 制作气泡图
本案例要使用Matplotlib模块制作气泡图。气泡图其实是在散点图的基础上升级改造而成的:在原有的x坐标和y坐标两个变量的基础上引入第3个变量,并用气泡的大小来表示。因此,制作气泡图同样要用到scatter()函数,只是参数的设置上有些区别。如右图所示,工作簿“销售统计表.xlsx”中记录了不同产品的销售量、销售额、毛利率数据,下面制作一个气泡图来同时展示不同产品的3类数据。
import matplotlib.pyplot as plt
import pandas as pd
plt.figure( figsize= ( 10,5 ))
data = pd.read_excel( '销售统计表.xlsx' ,sheet_name= 'Sheet1' )
n = data[ '产品名称' ]
x = data[ '销售量(台)' ]
y = data[ '销售额(元)' ]
z = data[ '毛利率(%)' ]
plt.scatter( x,y,s= z*5000,color= 'r' ,marker= 'o' )
plt.xlabel( '销售量(台)' ,fontdict= { 'family' : 'Microsoft YaHei' ,'color' : 'k' ,'size' :12} ,labelpad= 2 )
plt.ylabel( '销售额(元)' ,fontdict= { 'family' : 'Microsoft YaHei' ,'color' : 'k' ,'size' :12} ,labelpad= 2 )
plt.title( '销售量、销售额与毛利率关系图' ,fontdict= { 'family' : 'Microsoft YaHei' ,'color' : 'k' ,'size' :12} ,loc= 'center' )
for a,b,c in zip( x,y,n) :
plt.text( x= a,y= b,s= c,ha= 'center' ,va= 'center' ,fontsize= 12 ,color= 'w' )
plt.xlim( 20,100 )
plt.ylim( 0,50000 )
plt.rcParams[ 'font.sans-serif' ] = [ 'Microsoft YaHei' ]
plt.rcParams[ 'axes.unicode_minus' ] = False
plt.show( )
第5~8行代码分别指定数据标签的文本内容、x坐标的值、y坐标的值、气泡的大小,读者可根据实际需求修改列名。 第9行代码使用指定的数据制作气泡图,并对气泡图中气泡的大小、填充颜色和形状进行设置,读者可根据实际需求修改这些设置。这里将气泡的大小设置为毛利率的5000倍,这是因为毛利率的值比较小,如果不放大,则绘制出的气泡太小,导致图表不美观。 第10~16行代码用于为图表添加坐标轴标题、图表标题、数据标签,并设置坐标轴的刻度范围,从而让图表更加美观。读者可根据实际需求修改这些图表元素的设置。 运行结果
136 制作组合图表
组合图表是指在一个坐标系中绘制多张图表,其制作方法和单个图表的制作方法基本相同,区别在于单个图表中的x坐标值和y坐标值都只有一组,而组合图表的x坐标值可能会被多组y坐标值共用。如右图所示,工作簿“各月销售额统计表.xlsx”中记录了12个月的销售额数据和同比增长率,下面用Matplotlib模块制作一个柱形图和折线图的组合图表,同时展示各月的销售额对比情况和同比增长率的变化趋势
import matplotlib.pyplot as plt
import pandas as pd
plt.figure( figsize= ( 12,5 ))
data = pd.read_excel( '各月销售额统计表.xlsx' ,sheet_name= 'Sheet1' )
x = data[ '月份' ]
y1 = data[ '销售额(万元)' ]
y2 = data[ '同比增长率' ]
plt.bar( x,y1,color= 'y' ,label= '销售额(万元)' )
plt.legend( loc= 'upper left' ,fontsize= 12 )
plt.twinx( )
plt.plot( x,y2,color= 'r' ,linewidth= '3' ,label= '同比增长率' )
plt.legend( loc= 'upper right' ,fontsize= 10 )
plt.rcParams[ 'font.sans-serif' ] = [ 'Microsoft YaHei' ]
plt.rcParams[ 'axes.unicode_minus' ] = False
plt.show( )
第10行代码中的twinx()是Matplotlib模块的子模块pyplot中的函数,用于为图表设置次坐标轴。 运行结果
137 制作雷达图
雷达图可以看成由一条或多条闭合的折线组成,常用于同时比较和分析多个指标。如右图所示,工作簿“员工能力评价表.xlsx”中记录了3个员工的多项能力评价指标的分值,下面通过制作雷达图来评估这3个员工的综合能力。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
colors = [ 'r' ,'g' ,'y' ]
data = pd.read_excel( '员工能力评价表.xlsx' ,sheet_name= 'Sheet1' ,index_col= 0 ) .T
staff = data.index.to_list( )
column = data.columns.to_list( )
angle = np.linspace( 0.1 * np.pi,2.1 * np.pi,len( column) ,endpoint= False)
angle = np.concatenate(( angle, [angle[0 ]]))
column = np.concatenate(( column, [column[0 ]]))
figure = plt.figure( figsize= ( 8,6 ))
ax = figure.add_subplot( 1,1 ,1,projection= 'polar' )
for i,j in enumerate( staff) :
staff_data = data.loc[ j]
staff_data = np.concatenate(( staff_data, [staff_data[0 ]]))
ax.plot( angle,staff_data,linestyle= '-' ,linewidth= 2 ,color= colors[ i] ,label= str( j))
ax.fill( angle,staff_data,color= colors[ i] ,alpha= 0.7 )
ax.legend( loc= 4 ,bbox_to_anchor= ( 1.15 ,-0.07))
ax.set_thetagrids( angle * 180 / np.pi,column,fontsize= 12 )
plt.rcParams[ 'font.sans-serif' ] = [ 'Microsoft YaHei' ]
plt.rcParams[ 'axes.unicode_minus' ] = False
plt.show( )
第6行代码用于从行索引中获取员工名称,制作的雷达图中会显示所有员工的数据。如果只想显示指定员工的数据,如只显示“A员工”的数据,则将这行代码修改为“staff=[‘A员工’]”。 第11行代码创建了一张宽8英寸、高6英寸的画布。第12行代码将这张画布划分为1行1列,指定在第1个区域中绘图,并设置坐标体系为极坐标。第13~17行代码通过构造循环,为各个员工绘制雷达图。 第18行代码用于在图表中添加图例,legend()函数的参数loc=4表示将图例放置在右下角,参数bbox_to_anchor则用于确定图例在坐标轴方向上的位置。第19行代码用于在图表中添加数据标签。 (1)第5行代码中read_excel()函数的参数index_col用于指定以工作表中的哪一列数据作为DataFrame的行索引,这里设置为0,表示以第1列(即“评价指标”列)作为行索引。T则是DataFrame对象的属性,可生成转置行列后的新DataFrame。此时的data如下图所示。 (2)第6行代码先用index属性获取DataFrame的行索引,再用to_list()函数转换为列表,得到员工名称的列表。第7行代码先用columns属性获取DataFrame的列索引,再用to_list()函数转换为列表,得到评价指标名称的列表。 第14行代码中的loc是DataFrame对象的属性,用于根据行索引从DataFrame中选取行数据。 (3)第8行代码中的linspace()是NumPy模块中的函数,用于在指定的区间内返回均匀间隔的数值。该函数的第1个和第2个参数分别是区间的起始值和终止值;第3个参数用于指定生成的数值的数量,取值必须是非负数,默认值为50;参数endpoint用于指定结果是否包含终止值,如果省略该参数或者设置为True,则结果中一定会有终止值,如果为False,则结果中一定没有终止值。演示代码如下: 上述演示代码的第2行表示在0~100之间生成5个均匀分布的数值,且第一个数值是0,最后一个数值是100,其他3个数值分布在0~100之间。代码运行结果如下: 如果在演示代码第2行的linspace()函数中添加参数endpoint并设置为False,则会得到如下所示的运行结果: (4)第9、10、15行代码中的concatenate()也是NumPy模块中的函数,用于一次完成多个数组的拼接。 (5)第12行代码中的add_subplot()是Matplotlib模块的子模块pyplot中的函数,用于在一张画布上划分区域,以绘制多张子图。函数中的“1,1,1”表示将画布划分成1×1的区域,然后在第1个区域(区域按从左到右、从上到下的顺序编号)中绘制图表;projection='polar’表示设置坐标体系为极坐标。 (6)第17行代码中的fill()是Matplotlib模块的子模块pyplot中的函数,用于为由一组坐标值定义的多边形区域填充颜色。
138 制作漏斗图
漏斗图用于呈现从上到下几个阶段的数据,各阶段的数据逐渐变小。本案例要使用pyecharts模块中的Funnel()函数绘制一个漏斗图,展示电商网站上从浏览商品到完成交易各阶段人数的变化。
import pyecharts.options as opts
from pyecharts.charts import Funnel
x = [ '浏览商品' ,'放入购物车' ,'生成订单' ,'支付订单' ,'完成交易' ]
y = [ 1200,800 ,300,280,250]
data = [ i for i in zip( x,y) ]
chart = Funnel( )
chart.add( series_name= '人数' ,data_pair= data,label_opts= opts.LabelOpts( is_show= True,position= 'inside' ) ,tooltip_opts=
opts.TooltipOpts( trigger= 'item' ,formatter= '{a}:{c}' ))
chart.set_global_opts( title_opts = opts.TitleOpts( title= '电商网络流量转化漏斗图' ,pos_left= 'center' ) ,legend_opts= opts.LegendOpts( is_show= False))
chart.render( '漏斗图.html' )
第3行和第4行代码分别给出图表的x坐标和y坐标的值。第5行代码将列表x和y中对应的元素配对打包成一个个元组,然后将这些元组组成一个列表。这一操作必不可少,因为第6行代码中的Funnel()函数要求图表的数据格式必须是由元组组成的列表,即[(key_1,value_1),(key_2,value_2),…,(key_n,value_n)]的格式。 第7行代码用于添加并设置图表的系列名称、系列数据值和提示框等。第8行代码用于为图表添加图表标题并隐藏图例。第9行代码用于将制作的图表保存为一个网页文件,此处保存在代码文件所在文件夹下,文件名为“漏斗图.html”,读者可根据实际需求修改保存路径。 (1)第5行代码使用了列表推导式来让代码变得简洁,其等同于如下代码: (2)第7行代码中,add()函数的参数series_name用于指定系列名称,这里指定为“人数”。参数data_pair用于指定系列数据值。参数label_opts用于设置标签,标签的配置项又有多个参数:参数is_show用于控制是否显示标签,为True时显示标签,为False时不显示标签;参数position用于设置标签的位置,这里设置为’inside’,表示标签显示在图表内部,该参数的值还可以为’top’、‘left’、‘right’等。参数tooltip_opts用于设置提示框,提示框的配置项又有多个参数:参数trigger用于设置提示框的触发类型,其值一般设置为’item’,表示当鼠标指针放置在数据系列上时显示提示框;参数formatter用于设置提示框的显示内容,这里的’{a}‘代表系列名称,’{c}'代表数据值。 (3)第8行代码中set_global_opts()函数的配置项函数TitleOpts()用于为图表添加图表标题,并通过参数pos_left设置图表标题居中显示。配置项函数LegendOpts()的参数is_show设置为False,表示不显示图例。
139 制作水球图
水球图适合用于展示单个百分数。本案例要使用pyecharts模块中的Liquid()函数绘制水球图。
import pyecharts.options as opts
from pyecharts.charts import Liquid
actual_sale1 = 900000
actual_sale2 = 1589000
actual_sale3 = 285200
target_sale = 1200000
chart = Liquid( )
chart.set_global_opts( title_opts= opts.TitleOpts( title= '各地区销售业绩达成率' ,pos_left= 'center' ))
chart.add( series_name= '北京' ,data= [ actual_sale1/target_sale] ,shape= 'circle' ,center= [ '20%' ,'50%' ] )
chart.add( series_name= '上海' ,data = [ actual_sale2/target_sale] ,shape= 'circle' ,center= [ '50%' ,'50%' ] )
chart.add( series_name= '成都' ,data= [ actual_sale3/target_sale] ,shape= 'circle' ,center= [ '80%' ,'50%' ] )
chart.render( '水球图.html' )
第9~11行代码使用add()函数依次在水球图中绘制了3个水球。该函数的参数data用于指定系列数据,本案例要展示销售业绩达成率,所以使用实际销售业绩除以目标销售业绩,需要注意的是,该参数的值必须为列表格式。参数shape用于设置水球的形状,该参数的值可以为’circle’、‘rect’、‘roundrect’、‘triangle’、‘diamond’、‘pin’、‘arrow’,对应的形状分别为圆形、矩形、圆角矩形、三角形、菱形、地图图钉、箭头,默认形状为圆形。参数center用于指定水球的中心点在图表中的位置。 运行结果
140 制作仪表盘
仪表盘同水球图一样,也适合用于展示单个百分数。本案例要使用pyecharts模块中的Gauge()函数绘制仪表盘。
import pyecharts.options as opts
from pyecharts.charts import Gauge
chart = Gauge( )
chart.add( series_name= '业务指标' ,data_pair= [ ( '完成率' ,70.95) ] ,split_number= 10 ,radius= '75%' ,start_angle= 225 ,end_angle= -45,
is_clock_wise = True,title_label_opts= opts.GaugeTitleOpts( font_size= 30 ,color= 'red' ,font_family= 'Microsoft YaHei' ) ,
detail_label_opts = opts.GaugeDetailOpts( is_show= False))
chart.set_global_opts( legend_opts= opts.LegendOpts( is_show= False) ,tooltip_opts= opts.TooltipOpts( is_show= True,
formatter = '{a}<br/>{b}:{c}%' ))
chart.render( '仪表盘.html' )
第4行代码中add()函数的参数data_pair用于给出仪表盘的系列数据项;参数split_number用于指定仪表盘的平均分割段数,这里设置为10段;参数radius用于设置仪表盘的半径,其值可以是百分数或数值;参数title_label_opts用于设置仪表盘内标题文本标签的配置项。 运行结果
141 制作词云图
词云图是一种用于展示高频关键词的图表,它通过文字、颜色、图形的搭配产生极具冲击力的视觉效果。如右图所示,工作簿“图书销量表.xlsx”中记录了多种图书的销售量数据,下面使用pyecharts模块中的WordCloud()函数制作一个词云图,直观地展示不同图书的销量大小。
import pandas as pd
import pyecharts.options as opts
from pyecharts.charts import WordCloud
data = pd.read_excel( '图书销量表.xlsx' ,sheet_name= 'Sheet1' )
name = data[ '书名' ]
value = data[ '销售量(本)' ]
data1 = [ i for i in zip( name,value) ]
chart = WordCloud( )
chart.add( '销售量(本)' ,data_pair= data1,shape= 'star' ,word_size_range= [ 10,60 ] )
chart.set_global_opts( title_opts= opts.TitleOpts( title= '图书销量分析' ,title_textstyle_opts= opts.TextStyleOpts( font_size= 30 )) ,
tooltip_opts = opts.TooltipOpts( is_show= True))
chart.render( '词云图.html' )
(1)第7行代码是一个列表推导式,其等同于如下代码。 (2)与水球图类似,通过设置第9行代码中add()函数的参数shape,可改变词云图的外形轮廓。该参数可取的值有’circle’、‘cardioid’、‘diamond’、‘triangle-forward’、‘triangle’、‘pentagon’、‘star’,对应的形状分别为圆形、心形、菱形、指向右侧的三角箭头、三角形、五边形、星形。如果省略该参数,则词云图的外形轮廓为矩形。 运行结果