相关文章推荐
发财的脆皮肠  ·  Springdoc Openapi ...·  1 年前    · 
急躁的围巾  ·  Personal.xlsb error. ...·  1 年前    · 
图1 咨询报告图片

利用matplotlib代替excel绘制图表有如下几个好处:

1. 可以修改图表中所有的元素,另存为矢量图,高清,然后可应用于各种文档。

2. 熟练后,图表代码可以反复利用,只需要导入数据微调即可。

3. 整个绘图思路更有逻辑,相对Excel,更有趣不枯燥。(说着我都信了)

4. 最重要还是比较酷,学了python又不是程序员,总得做点力所能及又有意思的事儿。

1 如何画出高大上的图表?

各个行业的咨询机构,他们通常都自己的图表绘制规范,模仿咨询报告中的图表来高大上地,可以瞬间让自己的图表也高大上起业,升职,加薪,走上人生巅峰。我这里梳理了一下,画图的三个步骤。


图2 绘图步骤

以能源行业为例,如图1咨询报告图表所示,在上百页的报告里面,我们需要分析出现频率最高是哪三种类型的图表。然后,就盘这三种图表就好。在这份报告里面,大量地运用了各种条形图和拆线图,基础实用。下面,我就以其中 最简单的 最好看的的条形图,进行一个示例。

2. 开始图表绘制

下图是一个最基础的条形图,首先,分析这个图表和matplotlib默认的图表样式有什么不同。上轴线和右侧轴线没有。Y轴没有刻度线,没有轴线,只有刻度值。网格形式不同。颜色不同。修改的东西太多,所以我们一般第一步是选择一个matplotlib类似的模版,我这里选择的是seaborn-white。

图3. 报告原图

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')