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

可视化是信息交换的捷径

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([[<matplotlib.axes._subplots.AxesSubplot object at 0x000000001565C860>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x000000001582A5F8>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x0000000015A38080>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000000015885B38>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x0000000015BA0860>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000000015CA8438>]],
      dtype=object)
In [342]: axes[0,1]

Out [342]: <matplotlib.axes._subplots.AxesSubplot at 0x1630c4e0>

除此之外,还可以用以下参数来管理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日

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容