用python让excel飞起来(第7章 图表操作)

本文来自《超简单 利用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月'] #给出x坐标的数据
y = [100,90,88,70,66,50,40,55,56,88,95,98] #给出y坐标的数据
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 #导入pyecharts模块中的Bar()函数
x = ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'] #给出x坐标的数据
y = [100,90,88,70,66,50,40,55,56,88,95,98] #给出y坐标的数据
chart = Bar() #创建一个空白柱形图
chart.add_xaxis(x) #为图表添加x坐标的值
chart.add_yaxis('销售量',y) #为图表添加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月'] #给出x坐标的数据
y = [100,90,88,70,66,50,40,55,56,88,95,98] #给出y坐标的数据
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月'] #给出x坐标的数据
y = [100,90,88,70,66,50,40,55,56,88,95,98] #给出y坐标的数据
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月'] #给出x坐标的数据
y = [100,90,88,70,66,50,40,55,56,88,95,98] #给出y坐标的数据
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.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() #显示绘制的图表
  • (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月'] #给出x坐标的数据
y = [100,90,88,70,66,50,40,55,56,88,95,98] #给出y坐标的数据
plt.bar(x,y,width=0.5,align='center',color='k',label='销售量(台)') #制作柱状图并设置图例标签内容
plt.xlabel('月份',fontdict={'family':'SimSun','color':'k','size':12},labelpad=2) #添加并设置x轴标题
plt.ylabel('销售量(台)',fontdict={'family':'SimSun','color':'k','size':12},labelpad=2) #添加并设置y轴标题
#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.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() #显示绘制的图表
  • 第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月'] #给出x坐标的数据
y = [100,90,88,70,66,50,40,55,56,88,95,98] #给出y坐标的数据
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月'] #给出x坐标的数据
y = [100,90,88,70,66,50,40,55,56,88,95,98] #给出y坐标的数据
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) #设置y轴的刻度范围
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) #指定第1个绘图区域
plt.bar(x,y,width=0.5,align='center',color='r') #制作柱形图
plt.subplot(2,2,2) #指定第2个绘图区域
plt.pie(y,labels=x,labeldistance=1.1,autopct='%.2f%%',pctdistance=1.6) #制作饼图
plt.subplot(2,2,3) #指定第3个绘图区域
plt.plot(x,y,color='r',linewidth=3,linestyle='solid') #制作折线图
plt.subplot(2,2,4) #指定第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['配件名称'] #指定“配件名称”列的数据作为x坐标的值
y = data['销售数量'] #指定“销售数量”列的数据作为y坐标的值
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) #启动Excel程序
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) #启动Excel程序
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['配件名称']  # 指定“配件名称”列的数据作为x坐标的值
    y = data['销售数量']  # 指定“销售数量”列的数据作为y坐标的值
    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() #退出Excel程序

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['收货天数(天)'] #指定“收货天数(天)“列的数据作为x坐标的值
y = data['客户满意度'] #指定”客户满意度“列的数据作为y坐标的值
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) #添加x轴标题
plt.ylabel('客户满意度',fontdict={'family':'SimSun','color':'k','size':12},labelpad=2) #添加y轴标题
plt.xlim(0,22.5) #设置x轴的刻度范围
plt.ylim(0,12) #设置y轴的刻度范围
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 #导入pyecharts模块中的子模块options
from pyecharts.charts import EffectScatter #导入pyecharts模块中的EffectScatter()函数
data = pd.read_excel('客户满意度.xlsx',sheet_name='Sheet1') #从指定工作簿的工作表中读取数据
x = data['收货天数(天)'] #指定“收货天数(天)“列的数据作为x坐标的值
y = data['客户满意度'] #指定”客户满意度“列的数据作为y坐标的值
chart = EffectScatter() #创建一个空白散点图
chart.add_xaxis(x) #为图表添加x坐标的值
chart.add_yaxis(series_name='收货天数(天),客户满意度',y_axis=y,label_opts=opts.LabelOpts(is_show=False),symbol_size=15) #为图表添加y坐标的值
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['销售量(台)'] #指定“销售量(台)“列的数据作为x坐标的值
y = data['销售额(元)'] #指定”销售额(元)“列的数据作为y坐标的值
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) #添加并设置y轴标题
plt.ylabel('销售额(元)',fontdict={'family':'Microsoft YaHei','color':'k','size':12},labelpad=2) #添加并设置y轴标题
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) #设置x轴的刻度范围
plt.ylim(0,50000) #设置y轴的刻度范围
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['月份'] #指定“月份“列的数据作为x坐标的值
y1 = data['销售额(万元)'] #指定”销售额(万元)“列的数据作为y坐标的第1组值
y2 = data['同比增长率'] #指定“同比增长率”列的数据作为y坐标的第2组值
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 = ['浏览商品','放入购物车','生成订单','支付订单','完成交易'] #给出x坐标的数据
y = [1200,800,300,280,250] #给出y坐标的数据
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 #导入pyecharts模块中的Liquid()函数
actual_sale1 = 900000 #指定第1个地区的实际销售业绩
actual_sale2 = 1589000 #指定第2个地区的实际销售业绩
actual_sale3 = 285200 #指定第3个地区的实际销售业绩
target_sale = 1200000 #指定3个地区的目标销售业绩
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%']) #制作第1个地区的水球
chart.add(series_name='上海',data = [actual_sale2/target_sale],shape='circle',center=['50%','50%']) #制作第2个地区的水球
chart.add(series_name='成都',data=[actual_sale3/target_sale],shape='circle',center=['80%','50%']) #制作第3个地区的水球
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 #导入pyecharts模块中的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’,对应的形状分别为圆形、心形、菱形、指向右侧的三角箭头、三角形、五边形、星形。如果省略该参数,则词云图的外形轮廓为矩形。
    运行结果
    在这里插入图片描述
  • 14
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值