案例01 制作柱形图展示数据的对比关系——员工销售业绩统计表.xlsx
import xlwings as xw
app = xw.App(visible=True, add_book=False)
workbook = app.books.open('员工销售业绩统计表.xlsx') # 打开要制作图表的工作簿
for i in workbook.sheets: # 遍历工作簿中的工作表
chart = i.charts.add(left=200, top=0, width=355, height=211) # 设置图表的位置和尺寸
chart.set_source_data(i['A1'].expand()) # 读取工作表中要制作图表的数据
chart.chart_type = 'column_clustered' # 制作柱形图
workbook.save('柱形图.xlsx')
workbook.close()
app.quit()
运行结果打开柱形图.xlsx即可查看
用特定含义的字符串来指定图表类型,常用图表类型对应的字符串如下:
图表类型 字符串 图表类型 字符串 柱形图 ‘column_clustered' 饼图 'pie'
条形图 'bar_clustered' 圆环图 ‘doughnut’ 折线图 ‘line’ 散点图 ‘xy_scatter' 面积图 ’area‘ 雷达图 ’radar‘
批量制作条形图
import xlwings as xw
app = xw.App(visible = True, add_book = False)
workbook = app.books.open('员工销售业绩统计表.xlsx')
for i in workbook.sheets:
chart = i.charts.add(left = 200, top = 0, width = 355, height = 211)
chart.set_source_data(i['A1'].expand('table'))
chart.chart_type = 'bar_clustered' # 制作条形图
workbook.save('条形图.xlsx')
workbook.close()
app.quit()
案例02 制作折线图展示数据的变化趋势——月销售表.xlsx
import pandas as pd
import matplotlib.pyplot as plt
import xlwings as xw
df = pd.read_excel('月销售表.xlsx')
figure = plt.figure()
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = df['月份']
y = df['销售额']
plt.plot(x, y, color = 'red', linewidth = '3', linestyle = 'solid') # 制作折线图
plt.title(label = '月销售额趋势图', fontdict = {'color' : 'black', 'size' : 30}, loc = 'center') # 添加并设置图表标题
for a,b in zip(x,y): # 遍历折线图表标题
plt.text(a, b + 0.2, (a, '%.0f' % b), ha = 'center', va = 'bottom', fontsize = 10) # 添加并设置数据标签
plt.axis('off') # 隐藏坐标轴
app = xw.App(visible = False) # 启动Excel程序
workbook = app.books.open('月销售表.xlsx') # 打开要插入图表的工作簿
worksheet = workbook.sheets['Sheet1'] #选中工作表”Sheet1“
worksheet.pictures.add(figure, name = '图片1', update = True, left = 200) # 在工作表中插入制作的折线图
workbook.save('折线图.xlsx')
workbook.close()
app.quit()
运行结果:
axis()函数的参数值为’off’时表示不显示图表坐标轴,为‘on'时表示显示图表坐标轴
制作折线图并为最高点添加数据标签
import pandas as pd
import matplotlib.pyplot as plt
import xlwings as xw
df = pd.read_excel('月销售表.xlsx')
figure = plt.figure()
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = df['月份']
y = df['销售额']
plt.plot(x, y, color = 'red', linewidth = '3', linestyle = 'solid') # 制作折线图
plt.title(label = '月销售额趋势图', fontdict = {'color' : 'black', 'size' : 30}, loc = 'center') # 添加并设置图表标题
max1 = df['销售额'].max() # 获取最高销售额
df_max = df[df['销售额']== max1] # 选取最高销售额对应的行数据
for a,b in zip(df_max['月份'],df_max['销售额']): # 遍历折线图表标题
plt.text(a, b + 0.05, (a, '%.0f' % b), ha = 'center', va = 'bottom', fontsize = 10) # 添加并设置数据标签
plt.axis('off') # 隐藏坐标轴
app = xw.App(visible = False) # 启动Excel程序
workbook = app.books.open('月销售表.xlsx') # 打开要插入图表的工作簿
worksheet = workbook.sheets['Sheet1'] #选中工作表”Sheet1“
worksheet.pictures.add(figure, name = '图片1', update = True, left = 200) # 在工作表中插入制作的折线图
workbook.save('显示最高点数据标签的折线图.xlsx')
workbook.close()
app.quit()
运行结果:
制作平滑折线图
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from scipy import interpolate
import xlwings as xw
df = pd.read_excel('月销售表.xlsx')
figure = plt.figure()
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = df['月份']
y = df['销售额']
xnew = np.arange(1, 12, 0.1)
func = interpolate.interp1d(x, y, kind = 'cubic')
ynew = func(xnew)
plt.plot(xnew, ynew, color = 'red', linewidth = '3', linestyle = 'solid') # 制作平滑折线图
plt.title(label = '月销售额趋势图',fontdict = {'color' : 'black', 'size' : 30}, loc = 'center')
plt.xlabel('月份', fontdict = {'family' : 'SimSun', 'color' : 'black', 'size' : 20}, labelpad = 20)
plt.ylabel('销售额', fontdict = {'family' : 'SimSun', 'color' : 'black', 'size' : 20}, labelpad = 20)
plt.xlim(0, 12) # 设置图表x轴的取值范围
app = xw.App(visible = False)
workbook = app.books.open('月销售表.xlsx')
worksheet = workbook.sheets['Sheet1']
worksheet.pictures.add(figure, name = '图片1', update = True, left = 200)
workbook.save('平滑折线图.xlsx')
workbook.close()
app.quit()
运行结果:
arange()是NumPy模块中的函数,用于创建等差数组。
语法格式:
arange(start,stop,step)
参数 说明 start 起始值。可选参数,默认从0开始 stop 结束值。生成的数组不包含结束值 step 步长。可选参数,默认步长为1,如果指定了step,还必须给出start
案例03 制作散点图判断两组数据的相关性——汽车速度和刹车距离表.xlsx
import pandas as pd
import matplotlib.pyplot as plt
import xlwings as xw
df = pd.read_excel('汽车速度和刹车距离表.xlsx')
figure = plt.figure()
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = df['汽车速度(km/h)']
y = df['刹车距离(m)']
plt.scatter(x, y, s = 400, color = 'red', marker = 'o', edgecolor = 'black') # 制作散点图
plt.xlabel('汽车速度(km/h)', fontdict = {'family' : 'Microsoft YaHei', 'color' : 'black', 'size' : 20}, labelpad = 20) # 添加并设置x轴标题
plt.ylabel('刹车距离(m)', fontdict = {'family' : 'Microsoft YaHei', 'color' : 'black', 'size' : 20}, labelpad = 20) # 添加并设置y轴标题
plt.title('汽车速度与刹车距离关系图', fontdict = {'family' : 'Microsoft YaHei', 'color' : 'black', 'size' : 30}, loc = 'center') # 添加并设置图表标题
app = xw.App(visible = False) # 启动Excel程序
workbook = app.books.open('汽车速度和刹车距离表.xlsx') # 打开要插入图表的工作簿
worksheet = workbook.sheets[0] # 选中第1个工作表
worksheet.pictures.add(figure, name = '图片1', update = True, left = 200) # 在工作表中插入制作的散点图
workbook.save('散点图.xlsx')
workbook.close()
app.quit()
运行结果:
scatter()是Matplotlib模块中的函数,用于制作散点图。
语法格式:
scatter(x,y,s,color,marker,linewidth,edgecolor)
参数 说明 x x坐标的值 y y坐标的值 s 每个点的面积。如果该参数只有一个值或者省略该参数,表示所有点的大小都一样;如果该参数有多个值,则表示每个点的大小都不一样,此时散点图就变成了气泡图 color 每个点的填充颜色。即可以为所有点填充同一种颜色,也可以为不同的点填充不同的颜色 marker 每个点的形状。 linewidth 每个点的边框粗细 edgecolor 每个点的边框颜色
为散点图添加线性趋势线
import pandas as pd
import matplotlib.pyplot as plt
import xlwings as xw
from sklearn import linear_model
df = pd.read_excel('汽车速度和刹车距离表.xlsx')
figure = plt.figure()
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = df['汽车速度(km/h)']
y = df['刹车距离(m)']
plt.scatter(x, y, s = 400, color = 'red', marker = 'o', edgecolor = 'black')
plt.xlabel('汽车速度(km/h)', fontdict = {'family' : 'Microsoft YaHei', 'color' : 'black', 'size' : 20}, labelpad = 20)
plt.ylabel('刹车距离(m)', fontdict = {'family' : 'Microsoft YaHei', 'color' : 'black', 'size' : 20}, labelpad = 20)
plt.title('汽车速度与刹车距离关系图', fontdict = {'family' : 'Microsoft YaHei', 'color' : 'black', 'size' : 30}, loc = 'center')
model = linear_model.LinearRegression().fit(x.values.reshape(-1,1), y)
pred = model.predict(x.values.reshape(-1,1))
plt.plot(x, pred, color = 'black', linewidth = '3', linestyle = 'solid', label = '线性趋势线') # 绘制线性趋势线
plt.legend(loc = 'upper left')
app = xw.App(visible = False)
workbook = app.books.open('汽车速度和刹车距离表.xlsx')
worksheet = workbook.sheets[0]
worksheet.pictures.add(figure, name = '图片1', update = True, left = 200)
workbook.save('为散点图添加线性趋势线.xlsx')
workbook.close()
app.quit()
运行结果:
制作气泡图——气泡图.xlsx
import pandas as pd
import matplotlib.pyplot as plt
import xlwings as xw
df = pd.read_excel('气泡图.xlsx')
figure = plt.figure()
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = df['销售量']
y = df['利润(万)']
z = df['产品名称']
plt.scatter(x, y, s = y * 100, color = 'red', marker = 'o')
plt.xlabel('销售量', fontdict = {'family' : 'Microsoft YaHei', 'color' : 'black', 'size' : 20}, labelpad = 20)
plt.ylabel('利润(万)', fontdict = {'family' : 'Microsoft YaHei', 'color' : 'black', 'size' : 20}, labelpad = 20)
plt.title('销售量与利润关系图', fontdict = {'family' : 'Microsoft YaHei', 'color' : 'black', 'size' : 30}, loc = 'center')
for a, b, c in zip(x, y, z):
plt.text(a, b, c, ha = 'center', va = 'center', fontsize = 30, color = 'white')
plt.xlim(0, 800)
plt.ylim(0, 120)
app = xw.App(visible = False)
workbook = app.books.open('气泡图.xlsx')
worksheet = workbook.sheets[0]
worksheet.pictures.add(figure, name = '图片1', update = True, left = 200)
workbook.save('气泡图1.xlsx')
workbook.close()
app.quit()
运行结果:
案例04 制作饼图展示部分和总体的比例关系——饼图.xlsx
import pandas as pd
import matplotlib.pyplot as plt
import xlwings as xw
df = pd.read_excel('饼图.xlsx')
figure = plt.figure()
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = df['产品名称']
y = df['销售额']
plt.pie(y, labels = x, labeldistance = 1.1, autopct = '%.2f%%', pctdistance = 0.8, startangle = 90, radius = 1.0, explode = [0, 0, 0, 0, 0, 0.3, 0]) # 制作饼图并分离饼图块
plt.title(label = '产品销售额占比图', fontdict = {'color' : 'black', 'size' : 30}, loc = 'center') # 添加并设置图表标题
app = xw.App(visible = False)
workbook = app.books.open('饼图.xlsx')
worksheet = workbook.sheets[0]
worksheet.pictures.add(figure, name = '图片1', update = True, left = 200) # 在工作表中插入制作的饼图
workbook.save()
workbook.close()
app.quit()
运行结果:
pie()是Matplotlib模块中的函数, 用于制作饼图。
语法格式:
pie(x,explode,labels,colors,autopct,pctdistance,shadow,labeldistance,startangle,radius,counterclock,center,frame)
参数 说明 x 饼图块的数据系列值 explode 一个列表,指定每一个饼图块与圆心的距离 labels 每一个饼图块的数据标签内容 colors 每一个饼图块的填充颜色 autopct 每一个饼图块的百分比数值的格式 pctdistance 百分比数值与饼图块中心的距离 shadow
是否为饼图绘制阴影 labeldistance 数据标签与饼图块中心的距离 startangle 数据的第一个值对应的饼图块在饼图中的初始角度 radius 饼图的半径 counterclock 是否让饼图逆时针显示 center 饼图的中心位置 frame 是否显示饼图背后的图框
制作圆环图——饼图.xlsx
为pie()函数适当设置参数wedgeprops的值,就能制作出圆环图。
import pandas as pd
import matplotlib.pyplot as plt
import xlwings as xw
df = pd.read_excel('饼图.xlsx')
figure = plt.figure()
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = df['产品名称']
y = df['销售额']
plt.pie(y, labels = x, autopct = '%.2f%%', pctdistance = 0.85, radius = 1.0, labeldistance = 1.1, wedgeprops = {'width' : 0.3, 'linewidth' : 2, 'edgecolor' : 'white'}) # 用读取的数据制作圆环图
plt.title(label = '产品销售额占比图', fontdict = {'color' : 'black', 'size' : 30}, loc = 'center')
app = xw.App(visible = False)
workbook = app.books.open('饼图.xlsx')
worksheet = workbook.sheets[0]
worksheet.pictures.add(figure, name = '图片1', update = True, left = 200)
workbook.save()
workbook.close()
app.quit()
运行结果:
案例05 制作雷达图对比多项指标——雷达图.xlsx
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_excel('雷达图.xlsx')
df = df.set_index('性能评价指标') # 将数据中的'性能评价指标'列设置为行索引
df = df.T # 转置数据表格
df.index.name = '品牌' # 将转置后数据中行索引那一列的名称修改为“品牌”
def plot_radar(data, feature): # 自定义一个函数用于制作雷达图
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
cols = ['动力性', '燃油经济性', '制动性', '操控稳定性', '行驶平顺性', '通过性', '安全性', '环保性'] # 指定各个品牌要显示的性能评价指标的名称
colors = ['green', 'blue', 'red', 'yellow'] # 为每个品牌设置图表中的颜色
angles = np.linspace(0.1 * np.pi, 2.1 * np.pi, len(cols), endpoint = False) # 根据要显示的指标个数对圆进行等分
angles = np.concatenate((angles, [angles[0]])) # 连接刻度线数据
cols = np.concatenate((cols, [cols[0]]))
fig = plt.figure(figsize = (8, 8)) # 设置显示图表的窗口大小
ax = fig.add_subplot(111, polar = True) # 设置图表在窗口中的显示位置,并设置坐标轴为极坐标体系
for i, c in enumerate(feature):
stats = data.loc[c] # 获取品牌对应的指标数据
stats = np.concatenate((stats, [stats[0]])) # 连接品牌的指标数据
ax.plot(angles, stats, '-', linewidth = 6, c = colors[i], label = '%s'%(c)) # 制作雷达图
ax.fill(angles, stats, color = colors[i], alpha = 0.25) # 为雷达图填充颜色
ax.legend() # 为雷达图添加图例
ax.set_yticklabels([]) # 隐藏坐标轴数据
ax.set_thetagrids(angles * 180 / np.pi, cols, fontsize = 16) # 添加并设置数据标签
plt.show()
return fig
fig = plot_radar(df, ['A品牌', 'B品牌', 'C品牌', 'D品牌']) # 调用自定义函数制作雷达图
运行结果:
知识延伸
1、linspace()是Numpy模块中 的函数,用于在指定的区间内返回均价间隔的数字。
语法格式:
linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None)
参数 说明 start 区间的起始值 stop 区间的终止值 num 可选参数,指定生成的样本数。取值必须是非负数,默认值为50 endpoint 可选参数,指定终止值stop是否被包含在结果数组中。如果为True,则结果中一定会有终止值stop;如果为False,则结果中一定没有终止值stop retstep、dtype 可选参数,一般不使用 2、concatenate()函数用于一次完成多个数组的拼接。
语法格式:
concatenate((a1,a2,……),axis=0)
参数:
(a1,a1,……):要拼接的数组
axis=0:拼接的轴向,通常可以省略
3、add_subplot()函数用于在一张画布上划分区域,以绘制多张子图。
4、fill()函数用于为由一组坐标值定义的多边形区域填充颜色。
语法格式:
fill(x,y,color,alpha)
参数:
x,y:多边形各顶点的x坐标值和y坐标值列表
color:填充颜色
alpha:填充颜色的透明度
制作某一品牌性能评价指标雷达图——雷达图.xlsx
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_excel('雷达图.xlsx')
df = df.set_index('性能评价指标')
df = df.T
df.index.name = '品牌'
def plot_radar(data, feature):
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
cols = ['动力性', '燃油经济性', '制动性', '操控稳定性', '行驶平顺性', '通过性', '安全性', '环保性']
colors = ['green', 'blue', 'red', 'yellow']
angles = np.linspace(0.1 * np.pi, 2.1 * np.pi, len(cols), endpoint = False)
angles = np.concatenate((angles, [angles[0]]))
cols = np.concatenate((cols, [cols[0]]))
fig = plt.figure(figsize = (8, 8))
ax = fig.add_subplot(111, polar = True)
for i, c in enumerate(feature):
stats = data.loc[c]
stats = np.concatenate((stats, [stats[0]]))
ax.plot(angles, stats, '-', linewidth = 6, c = colors[i], label = '%s'%(c))
ax.fill(angles, stats, color = colors[i], alpha = 0.25)
ax.legend()
ax.set_yticklabels([])
ax.set_thetagrids(angles * 180 / np.pi, cols, fontsize = 16)
plt.show()
return fig
fig = plot_radar(df, ['A品牌']) # 查看A品牌的性能评价指标情况
运行结果:
案例06 制作温度计图展示工作进度——温度计图.xlsx
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_excel('温度计图.xlsx')
sum = 0 # 定义变量sum,用于存储全年的实际销售业绩
for i in range(12):
sum = df['销售业绩(万元)'][i] + sum # 累加12个月的实际销售业绩,得到全年的实际销售业绩
goal = df['销售业绩(万元)'][13] # 获取全年的目标销售业绩
percentage = sum / goal # 计算全年的实际销售业绩占目标销售业绩的百分比
plt.bar(1, 1, color = 'yellow') # 制作柱形图展示全年的目标销售业绩
plt.bar(1, percentage, color = 'cyan') # 制作柱形图展示全年的实际销售业绩,设置填充颜色为青色
plt.xlim(0, 2) # 设置图表x轴的取值范围
plt.ylim(0, 1.2) # 设置图表y轴的取值范围
plt.text(1, percentage - 0.01, percentage, ha = 'center', va = 'top', fontdict = {'color' : 'black', 'size' : 20}) # 添加并设置数据标签
plt.show() # 显示制作的温度计图
运行结果:
制作上半年销售业绩的温度计图
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_excel('温度计图.xlsx')
sum = 0
for i in range(6):
sum = df['销售业绩(万元)'][i] + sum
goal = df['销售业绩(万元)'][13]
percentage = sum / goal
plt.bar(1, 1, color = 'yellow')
plt.bar(1, percentage, color = 'cyan')
plt.xlim(0, 2)
plt.ylim(0, 1.2)
plt.text(1, percentage - 0.01, percentage, ha = 'center', va = 'top', fontdict = {'color' : 'black', 'size' : 20})
plt.show()
运行结果:
使用python制作常用图表 ,这些案例中使用到的数据文件请点击这里 【免费】使用python制作常用图表所要使用的数据.zip资源-CSDN文库