0 前言
针对业余学习python的人,工作中主要还是使用office三件套,做图还是靠excel,琐碎复杂和重复。这里主要是希望分享给普通职场人,如何利用python绘制咨询报告或者PPT中常用的图表。
利用matplotlib代替excel绘制图表有如下几个好处:
1. 可以修改图表中所有的元素,另存为矢量图,高清,然后可应用于各种文档。
2. 熟练后,图表代码可以反复利用,只需要导入数据微调即可。
3. 整个绘图思路更有逻辑,相对Excel,更有趣不枯燥。(说着我都信了)
4. 最重要还是比较酷,学了python又不是程序员,总得做点力所能及又有意思的事儿。
1 如何画出高大上的图表?
各个行业的咨询机构,他们通常都自己的图表绘制规范,模仿咨询报告中的图表来高大上地,可以瞬间让自己的图表也高大上起业,升职,加薪,走上人生巅峰。我这里梳理了一下,画图的三个步骤。
以能源行业为例,如图1咨询报告图表所示,在上百页的报告里面,我们需要分析出现频率最高是哪三种类型的图表。然后,就盘这三种图表就好。在这份报告里面,大量地运用了各种条形图和拆线图,基础实用。下面,我就以其中最简单的最好看的的条形图,进行一个示例。
2. 开始图表绘制
下图是一个最基础的条形图,首先,分析这个图表和matplotlib默认的图表样式有什么不同。上轴线和右侧轴线没有。Y轴没有刻度线,没有轴线,只有刻度值。网格形式不同。颜色不同。修改的东西太多,所以我们一般第一步是选择一个matplotlib类似的模版,我这里选择的是seaborn-white。
2.1 导入数据
工作中一般人大部分的数据都存在excel里面。可以用xlwings模版直接导入excel里面的数据,关于xlwings模块的介绍可以详见我的其他文章《插上翅膀,让Excel飞起来》。
import xlwings as xw
import matplotlib.pyplot as plt
from matplotlib.ticker import StrMethodFormatter
#设置图表字体和字号
plt.rcParams['font.sans-serif']=['Arial']
plt.rcParams['font.size']=8
# 导入数据(易出错,导致excel进程卡死,使用try语句)
try:
app=xw.App(visible=False,add_book=False)
file_path=r'g:\00 My Document\Computer Science\Code Resource\bar_data.xlsx'
wb=app.books.open(file_path)
width = 0.8
x_labels=wb.sheets['xlabel'].range('A1').expand('down').value
x1=wb.sheets['X'].range('A1').expand('down').value
x2=wb.sheets['X'].range('B1').expand('down').value
y1=wb.sheets['Y'].range('A1').expand('down').value
y2=wb.sheets['Y'].range('B1').expand('down').value
color1=wb.sheets['color'].range('A1').expand('down').value
color2=wb.sheets['color'].range('B1').expand('down').value
label1=r'2015'
label2=r'2040'
x_ticks=[i+0.5 for i in x1]
app.quit()
except:
app.quit()
3.2 绘制数据
#绘制数据
plt.style.use('seaborn-white')
fig=plt.figure(figsize=(5.5,3.5))
ax=fig.add_subplot()
rects1 = ax.bar(x1,y1, width=width, label=label1,color=color1,zorder=4)
rects2 = ax.bar(x2,y2, width=width, label=label2,color=color2,zorder=4)
for i,j in zip(x2,y2):
ax.text(i,j+100,'{:,.0f}'.format(j),horizontalalignment='center')
3.3 坐标轴及网格线设置
#坐标轴及网格线设置
ax.set_ylim((0,5000))#设置Y轴范围
ymajorFormatter = StrMethodFormatter('{x:,.0f}')#Y轴刻度千分位显示
ax.yaxis.set_major_formatter(ymajorFormatter)#Y轴刻度千分位显示
ax.spines['top'].set_visible(False) #去掉上边框
ax.spines['left'].set_visible(False) #去掉左边框
ax.spines['right'].set_visible(False) #去掉右边框
ax.spines['right'].set_color(color1)#设置x轴颜色
ax.spines['bottom'].set_zorder(4)#设置x轴图层高于条形图
ax.yaxis.grid(color=color1, linestyle=':', linewidth=1,alpha=0.3)#设置网格
#添加x轴坐标
ax.set_xticks(x_ticks)
ax.set_xticklabels(x_labels)
3.4 绘制图例、标题和注释并保存
#绘制图例及标题并保存
title='Figure 1.2 Demand Forecast by ERIA'
note='ERIA = Economic Research Institute for ASEAN and East Asia,ktoe = kilotonnes of\noil equivalent,LPG = liquefied petroleum gas.\nSource: ERIA Outlook 2018.'
#图例
ax.legend(ncol=2,loc='center',bbox_to_anchor=(0.5,-0.1))
#标题
ax.set_title(title,pad=20,fontname='Times New Roman', fontsize=10)
#注释
ax.text(9,5200,r'(1,000 ktoe)',alpha=0.8)
ax.text(0,-1300,note,alpha=0.8)
#保存
fig.savefig('demo.svg',dpi=600,bbox_inches = 'tight')
4. 结语
1. Matplotlib可应用绘制日常工作中的工作报告或者PPT所需要的高质量图表,而不仅只用于科研绘图或者大数据的可视化。
2. 绘图90%的工作主要是对坐标轴、字体、颜色等进行设置,实际上关于这些代码可以反复利用。
3. 如需交流或者需要原代码和示例数据,欢迎关注我的公众号:早起收果子