Python量化投资:技术、模型与策略
上QQ阅读APP看书,第一时间看更新

4.1 Matplotlib

Matplotlib是Python最核心、最底层的可视化库。虽然使用Pandas和seaborn也能简单地绘制图形,但必要的时候也是不得不去用一些Matplotlib的语法来完成更多的定制化功能,所以掌握一些Matplotlib的基本语法是有好处的。

4.1.1 散点图

在数据分析中,散点图是最常用的探索两个数据之间相关关系的可视化图形。示例代码如下:


import numpy as np
import matplotlib.pyplot as plt
N=1000
x=np.random.randn(N)
y=np.random.randn(len(x))
plt.scatter(x,y)
plt.show()

运行结果如图4-1所示。

图 4-1

4.1.2 直方图

直方图主要用于研究数据的频率分布,示例代码如下:


import numpy as np
import matplotlib.pyplot as plt

mu = 100  # mean of distribution
sigma = 20  # standard deviation of distribution
x = mu + sigma * np.random.randn(2000)

plt.hist(x, bins=20,color='red',normed=True)

plt.show()

运行结果如图4-2所示。

4.1.3 函数图

除了这种比较简单的图形之外,Matplotlib也可以胜任比较复杂的定制化图形。示例代码如下:


import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon

def func(x):
    return -(x - 1) * (x - 6)+50

x = np.linspace(0, 10)
y = func(x)

fig, ax = plt.subplots()
plt.plot(x, y, 'r', linewidth=2)
plt.ylim(ymin=0)

a, b = 2, 9 
ix = np.linspace(a, b)
iy = func(ix)
verts = [(a, 0)] + list(zip(ix, iy)) + [(b, 0)]
poly = Polygon(verts, facecolor='0.9', edgecolor='0.5')
ax.add_patch(poly)

plt.text(0.5 * (a + b), 20, r"$\int_a^b (-(x - 1) * (x - 6)+50)\mathrm{d}x$",
         horizontalalignment='center', fontsize=20)

plt.figtext(0.9, 0.05, '$x$')
plt.figtext(0.1, 0.9, '$y$')

ax.set_xticks((a, b))
ax.set_xticklabels(('$a$', '$b$'))
ax.set_yticks([])

plt.show()

图 4-2

运行结果如图4-3所示。

图 4-3

4.1.4 Matplotlib和seaborn的中文乱码问题

将中文乱码这个问题单独提出来,是因为笔者曾在网上发表过一篇博客,介绍碰到中文乱码的两种解决方案,很多人搜到这篇文章并且点赞,说明很多人都碰到过这个问题,需要解决,故而本节将这两种解决方案整理到这里,以供大家参考。

在Windows下面,使用Matplotlib画图时,中文会显示为乱码,主要原因是Matplotlib默认没有指定中文字体。

下面就来介绍这两种解决方案。

第一种是在画图的时候指定字体。示例代码如下:


import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=12)

plt.plot([1,2,3])
plt.title(u"测试",fontproperties=font)

运行结果如图4-4所示。

这种方法比较麻烦,因为每次画图的时候,都要指定字体位置。

第二种是修改配置文件,这是一种一劳永逸的方案。

1)将C:\Windows\Fonts下面的字体simsun.ttf(微软雅黑字体)复制到D:\Programs\Anaconda\Lib\site-packages\matplotlib\mpl-data\fonts\ttf文件夹下(Anaconda文件夹的位置与安装位置有关)。

图 4-4

2)用记事本打开D:\Programs\Anaconda\Lib\site-packages\matplotlib\mpl-data\matplotlibrc。

找到如下两行代码:


#font.family         : sans-serif
#font.sans-serif     : Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, 
    Arial, Helvetica, Avant Garde, sans-serif

去掉这两行前面的#,并且在font.sans-serif的冒号后面加上SimHei,结果如下所示:


font.family         : sans-serif
 font.sans-serif     : SimHei,Bitstream Vera Sans, Lucida Grande, Verdana, Geneva,  
    Lucid, Arial, Helvetica, Avant Garde, sans-serif

重新启动Python,Matplotlib就可以输出中文字符了。

上面的方法对于Matplotlib是可以用的,但是如果引入了seaborn,就又会出现中文显示乱码的问题,目前的解决方法是,在程序中加入以下代码:


import seaborn as sns
sns.set_style('whitegrid',{'font.sans-serif':['simhei','Arial']})

如果在Mac OS X系统中修改配置文件的方法没有成功,则可以采用如下方法解决。

可以用seaborn加代码的方式。或者对于Matplotlib,添加如下代码:


from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False   # 解决保存图像是负号'-'显示为方块的问题