matplotlib神器
当我们完善地处理好数据,还需将其用于与他人的交流,仅递上冰冷的数据,很难产生良好的效果。于是,为满足将数据图形化、令阅读者一目了然的需求,matplotlib应运而生。
1、一个简单的图形
通过调用matplotlib第三方库,我们敲入简单的几行代码,便可纷繁的数据绘制成图。例如:
%matplotlib notebook
import matplotlib.pyplot as plt
import numpy as np
x = range(0,100,3)
y = [(a+1)*2 for a in x]
plt.plot(x,y)
plt.show()
2、设置内容的层次
对于一个图形,我们要设置的内容主要有以下几个方面:
其中,Title为标题。Axis为坐标轴,Label为坐标轴标注。Tick为刻度线,Tick Label为刻度注释。
当我们要创建一个新图形,可以输入fig = plt.figure()
,得到一个没有内容的空图。
3、如何摆放小图
在一幅空图中,我们可以根据需要,摆放一些小图:
fig = plt.figure()
ax1 = fig.add_subplot(2, 2, 1)
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 1, 2)
add_subplot(2, 2, 1)的意思是,在2X2的空间里,有四个摆图的位置,选定第1个位置。如果add_subplot(2, 1, 2),就是在2X1的宽图中,选择第二行的图片。上面这串代码整合起来的结果如下:
如果现在执行plt.plot(np.random.randn(100).cumsum())
,程序会在最后一个用过的subplot上画图,如果之前没有图,则程序会自动创建一个图,并隐藏创建figure和subplot的过程。下面试着输入:
i=0
while i<200 :
plt.plot(np.random.randn(100).cumsum(), 'k--')
i += 1
画图200次后,得到了正态分布二叉树的图形:
4、画直方图和散点图
ax1.hist(np.random.randn(150), bins=30, color='g', alpha=0.5) # 直方图
ax2.scatter(np.arange(50), np.arange(50) + 5 * np.random.randn(50)) # 散点图
5、用索引的方式管理小图
除了用add_subplot(2, 2, 1)函数创建小图,还可以用plt.subplot()的方式创建,后者可以自动返回一个包含小图对象的NumPy数组,可以作为用索引来管理小图的工具。例如:
In[340]:
fig, axes = plt.subplots(3,2)
axes
Out[340]:
array([[,
],
[,
],
[,
]],
dtype=object)
In [342]: axes[0,1]
Out [342]:
除此之外,还可以用以下参数来管理subplot:
7、小图间距的调整
小图可以有宽的间距,也可以完全取消间距。调整间距可以提升绘图的逼格。
若要取消间距,可输入:
fig, axes = plt.subplots(3,2,sharex=True, sharey=True)
plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0, hspace=0)
得到:
6、线型、颜色、标记点
在画图的代码中,'k--'表示用黑色、虚线来绘制图形,这是快捷的做法。完整的语法是plt.plot(np.random.randn(100).cumsum(), color='k', linestyle=‘--’)
如果要在数据节点加黑圈,可以在参数中加入marker='o'
,或简写为go-- #(绿色虚线为'g--')
,不过需要注意,标记类型和线型必须放在颜色后面。
另外,在数据节点之间,matplotlib默认使用线性插值,可用参数drawstyle
来修改,例如drawstyle=‘steps-post’
fig = plt.figure()
plt.subplot(1,1,1)
data = np.random.randn(100).cumsum()
plt.plot(data, 'k--', label='Normal')
plt.plot(data, 'g-', drawstyle='steps-post', label='steps-post')
plt.legend(loc='best')
7、刻度、标签、图例
坐标轴的刻度、标签,可用以下方式设置:
ticks = ax.set_xticks(np.linspace(0,100,5))
labels = ax.set_xticklabels(np.linspace(0,100,5),rotation=30, fontsize='large') # rotation表示标签旋转30度
ax.set_xlabel(u'x轴标签')
#也可以用set()的方式得到同样的效果:
# props = {
# 'title': 'hello',
# 'xlabel':u'xlabel'
# }
# ax.set(**props)
创建图例的方法:
ax.plot(np.random.randn(1000).cumsum(), 'k', label='one')
ax.plot(np.random.randn(1000).cumsum(), 'k--', label='two')
ax.plot(np.random.randn(1000).cumsum(), 'k.', label='three')
plt.legend(loc='best') # 或用ax.legend() 来调用图例
# 要从图例中去除一个或多个元素,不传入label或传入label='nolegend'即可
运行结果如下:
8、在图中添加注解
添加注解使用的函数主要用text()、arrow()、annotate()。
test()可以在制定的坐标位置(x,y)写入文本内容:
fig = plt.figure()
fig.suptitle('use suptitle()', fontsize=14, fontweight='bold')
ax = fig.add_subplot(1,1,1)
fig.subplots_adjust(top=0.85)
ax.set_title('use set_title()')
ax.set_xlabel('use set_xlabel')
ax.set_ylabel('use set_ylabel')
ax.text(3, 8, 'use text() in data coords', style='italic',bbox={'facecolor':'gray', 'alpha':0.5, 'pad':5}) #pad是box的大小
ax.text(2, 6, r'an equation: $E=mc^2$', fontsize=20)
ax.text(5, 2, u'what\'s up?')
ax.text(0.95, 0.01, 'colored text in axes coords',
verticalalignment='bottom', horizontalalignment='right',
transform=ax.transAxes,
color='green', fontsize=25)
ax.plot([2], [1], 'o') #加个节点标识
ax.annotate('use annotate()', xy=(2, 1), xytext=(3, 4),
arrowprops=dict(facecolor='black', shrink=0.1)) #shrink是箭头到点的距离
ax.axis([0, 10, 0, 10])
plt.show()
9、在图中加入图形
流程是,先创建一个块对象shp,然后通过ax.add_patch(shp)将其添加到subplot中。
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
Rectangle = plt.Rectangle((0.2, 0.65), 0.5, 0.25, color='k', alpha=0.3) #矩形 (起始点,长,宽,颜色,透明度)
Circle = plt.Circle((0.7, 0.2), 0.05, color='b', alpha=0.3) #圆形
Polygon = plt.Polygon([[0.15, 0.15], [0.25, 0.4], [0.2, 0.4]],
color='g', alpha=0.5) #多边形
ax.add_patch(Rectangle) #加入小块
ax.add_patch(Circle)
ax.add_patch(Polygon)
10、图片另存为
最常用到两个重要的参数是dpi(控制“每英寸点数”分辨率)和bbox_inches(剪除当前图表周围的空白部分)。
比如说,要导出一张带有小白边且分辨率为500DPI的PNG图片,可以输入:
# 仅仅导出图片可用plt.savefig('name.png')
plt.savefig('name.png', dpi=500, bbox_inches='tight')
更多参数可参考:
11、配置matplotlib的默认参数
可使用rc(‘希望自定义的对象’, ‘属性’)进行配置,例如:
plt.rc('figure', figsize=(8, 8)) # 设置图片的默认大小为8X8
# 还可以设置'figure'、'axes'、'xtick'、'ytick'、'grid'、'legend'等
# 也可以用字典的方式一次性设置
# 例如:
font_options = {'family' : 'monospace',
'weight' : 'bold',
'size' : 'small'}
plt.rc('font', **font_options)
总结
学会用matplotlib绘图,就如同学会用PPT做展示一般,能够更加生动地将冰冷的数据呈现出来,更易让他人理解和接受自己的观点。
刺猬偷腥
2018年9月30日