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 # 解决保存图像是负号'-'显示为方块的问题