作者:llama
审稿:童蒙
编辑:amethyst
如今科研绘图的软件很多,但是如果是需要在脚本中就出图的话,其实python本身自带的matplotlib就非常好用,操作也很简单,跟着小编来看看如何实现吧!
保证看完就会!
但是在学习之前,有一点非常重要,这也是我在学习的时候碰到的问题——在matplotlib中绘制出同样的图有很多种方法,而在这所有的方法中间,有两个领头大佬:plt和ax,常常会让人混淆。
所以在正式的绘图前,我们先用几分钟弄清这两者的区别以及matplotlib是如何利用这两者进行工作的,弄清楚之后你就不再是离开谷歌就没法画图的脚本搬运工啦!
plt和ax区别
首先,当我们说到plt时,应当知道这个是大多数人导入matplotlib包时的别名。
import matplotlib.pyplot as plt
在matplotlib的官网上对于用matplotlib绘制出来的图有一个生动的介绍:
matplotlib官网(https://matplotlib.org/1.5.1/faq/usage_faq.html#parts-of-a-figure)
那么其实很容易理解这张图,我们代入自己如果是一个画家,那么其实Figure就是我们画画要用的纸(也就是画布),而Axes则是我们画画的区域,这个区域可大可小,可以是一块区域,也可以是多个区域,在这其中的Axis才是横纵坐标。
知道这一点后,我们再来看单个Axes中每个元素的名字:
matplotlib_usage(https://matplotlib.org/tutorials/introductory/usage.html)
那么根据这些,我们来比较plt和ax的区别:
# 使用plt
plt.figure()
plt.plot([1,2,3],[4,5,6])
plt.show()
# 使用ax
fig,ax = plt.subplots()
ax.plot([1,2,3],[4,5,6])
plt.show()
结果如下:
请大家认真看这两张图,回答一下到底哪里不一样?
回答:其实两张图是一模一样的。不知道你们有没有回答对(手动狗头)。那么两者的区别到底是在哪里呢,其实是在你没法看到的程序实现阶段。使用plt时,我们先生成了一个画布,然后在这个画布上生成了一个隐式区域进行绘图,而在使用ax时,则是生成了画布和画图区域两个对象之后再进行的绘图操作。可以理解为,其实plt有点像薛定谔的图,没有出图之前你并不知道这个图会出现在哪里,而利用ax进行绘制时,图是握在你自己的手上的。
绘制柱状图
那么在这个教程中,我们就以绘制柱状图为例子来进行学习。在进行绘制之前,作为金牌推销员还要再推荐一个python包,搭配matplotlib简直不能更好用——那就是pandas。
#导入所需的包
import pandas as pd
import matplotlib.pyplot as plt
#如果标签为中文需导入中文字体,确认SimHei字体已在库中
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#先自己给一个数据,如果是excel表格直接导入即可
df = pd.DataFrame({'x':['January','February','March','April','May','June'],'y':[20,30,15,25,27,21]})
#绘图
fig,ax = plt.subplots()
x=[i+1 for i in range(len(df['x']))]
ax.bar(x,df['y'],width=0.4,color='skyblue', ec='black')
#添加柱子上数字
for a, b in zip(x, df['y']):
ax.text(a,b+0.5,b,ha='center', va='bottom', fontsize=10)
#添加x轴标签
ax.set_xticks(x)
ax.set_xticklabels(df['x'])
#添加图标签
ax.set_title('Sales')
ax.set_ylabel('Sales')
plt.show()
其中,添加标签等在任意图中都适用,在柱状图的绘制中,重要的是ax.bar(),使用方法为:
ax.bar(x,height,width,bottom,align,**kwargs)
#x为横坐标的值
#height为各柱子的高度
#width为柱子的宽度,默认是0.8
#bottom为柱子底部开始的位置,默认为0
#align柱子的底部是在中心还是边缘,默认为center
#**kwargs各种图都适用的参数,例如color表示柱子的颜色,edgecolor简写ec,表示柱子边框颜色等等
那么其他类型的图,则用不同的包即可,例如:散点图或折线图:ax.plot(),饼图:ax.pie()等等,其实方法都是一样啦!
网友评论