刺猬教你量化投资(十七):信息可视化的基础功能

可视化是信息交换的捷径

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、设置内容的层次

对于一个图形,我们要设置的内容主要有以下几个方面:

image.png
image.png

其中,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的宽图中,选择第二行的图片。上面这串代码整合起来的结果如下:

image.png

如果现在执行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次后,得到了正态分布二叉树的图形:

image.png
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)) # 散点图
image.png
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:

image.png
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)

得到:

image.png

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')
image.png
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)
image.png

创建图例的方法:

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

image.png
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)

image.png
10、图片另存为

最常用到两个重要的参数是dpi(控制“每英寸点数”分辨率)和bbox_inches(剪除当前图表周围的空白部分)。

比如说,要导出一张带有小白边且分辨率为500DPI的PNG图片,可以输入:

# 仅仅导出图片可用plt.savefig('name.png')

plt.savefig('name.png', dpi=500, bbox_inches='tight')

更多参数可参考:

more 参数
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日

你可能感兴趣的:(刺猬教你量化投资(十七):信息可视化的基础功能)