8. 绘图和可视化——matplotlib

首先确定IPython 是以Pylab 模式启动的。

  • 在命令行窗口(CMD窗口)输入 ipython --pylab
  • 或者在ipython 环境下输入%pylab

 

 绘制一条直线:

 

 

8.1  Figure和Subplot

matplotlib 的图像都位于Figure 对象中。 可以用plt.figure 创建一个新的Figure:   这时会弹出一个空窗口。

fig = plt.figure()

 

matplotlib 中的Figure 支持一种MATLAB 式的编号架构(eg. plt.figure(2))。通过plt.gcf() 即可得到当前Figure 的引用。

 

不能通过空Figure 绘图,必须用 add_subplot 创建一个或多个 subplot :

ax1 = fig.add_subplot(2, 2, 1)

这个代码的意思是,图像应该是 2*2 的,且当前选中的是4个 subplot 中的第一个。接着创建后面的:

 

ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 3)

 

 

 结果:

 

 

此时,发出一条绘图命令,matplotlib 就会在最后一个用过的 subplot (如果没有则创建一个)上进行绘图。

 

from numpy.random import randn
plt.plot(randn(50).cumsum(), 'k--')

 

 

 继续在其他两个subplot中画图:

_ = ax1.hist(randn(100), bins =20, color = 'k', alpha =0.3)
ax2.scatter(np.arange(30), np.arange(30) + 3*randn(30))

结果:

 

 

8.2  subplots

(补)

 

8.3  颜色、标记和线型

matplotlib 的plot 函数接受一组(x, y)坐标,还可以接受有个表示颜色和线型的字符串缩写。

              ax.plot(x, y, 'g--')     #绿色虚线

等价于:ax.plot(x, y, linestyle='--', color='g')   #绿色虚线

 

 线型图可以加标记(marker),以强调实际的数据点。

!!!标记类型和线型必须放在颜色后面

plt.plot(randn(30).cumsum(), 'ko--')   #等价于
plt.plot(randn(30).cumsum(), color='k',linestyle='dashed', marker='o')   

结果:

 

 

 8.4  刻度、标签和图例

对于大多数的图标装饰项,主要实现方式有二:

    • 使用过程型的pyplot 接口;
    • 面向对象的原生matplotlib API 。

pyplot 接口的设计目的就是交互式使用,含有诸如xlim、xticks 和 xticklabels 之类的方法。分别控制图表的范围、刻度位置、刻度标签等。使用方式包括以下两种:

  • 调用时不带参数,则返回当前的参数值。例如 plt.xlim() 返回当前的x 轴绘图范围。
  • 调用时带参数,则设置参数值。因此,plt.xlim([0, 10]) 会将x 轴的范围设置为0到10。

 

8.5 设置标题、轴标签、刻度以及刻度标签

首先,我们创建一个简单的随机漫步图像来介绍:

fig3 = plt.figure()
ax = fig3.add_subplot(1,1,1)
ax.plot(randn(1000).cumsum())

结果:

 

 设置 x 轴的刻度及刻度标签:

ticks = ax.set_xticks([0, 250, 500, 750, 1000])
labels = ax.set_xticklabels(['one', 'two', 'three', 'four', 'five'], rotation = 30, fontsize = 'small')

 

 

 

 

设置 x 轴的名称:

ax.set_xlabel('Stages')

 

 

 

 

图表添加图名:

 

ax.set_title('my first plot')

 

最终结果:

 

代码如下:

 

 

 

8.6   添加图例

图例( legend )是一种用于标识图表元素的重要工具。添加方式有两个:

  • 在添加subplot 的时候传入 label 参数;
ax.plot(randn(1000).cumsum(), 'k--', label = 'first')
ax.plot(randn(1000).cumsum(), 'g--', label = 'second')
  • 调用ax.legend()  或者plt.legend() 。
ax.legend(loc = 'best')

注: 要从图例中去除一个或多个元素,不传入label 或者传入 label = '_nolegend_' 即可。

 

8.7 注解以及在Subplot 上绘图

除标准的图标对象之外,有时候可能需要绘制一些自定义的注解(比如文本。箭头和其它图形等)。注释可以通过text 、arrow和annotate 等函数进行添加。

 

8.8  将图标保存到文件

保存的文件类型是通过文件扩展名推断出来的。我们保存图片时最常用的两个重要的选项是dpi (控制‘每英寸点数’分辨率)和 bbox_inches(可以剪除当前图表周围的空白部分)。

 

 plt.savefig('E:\\python/123.png', dpi=400, bbox_inches = 'tight')

 

结果:

 

 

 

savefig 并非一定要写入磁盘,也可以写入任何文件型的对象,如StringIO:

 

from io import StringIO
buffer = StringIO()
plt.savefig(buffer)
plot_data = buffer.getvalue()

 

这对在Web 上提供动态生成的图片时很实用的。

 

 

Figure。savefig 除了dpi 和bbox_inches 还有一些其他的选项:

 

 

 

8.9  matplotlib 配置

 matplotlib自带一些配色方案,以及为生成出版质量的图片而设定的默认配置信息,可以管理图像的大小,subplot 边距、配色方案、字体大小、网格类型等。操作 matplotlib 配置系统的方式主要有两种。第一种是Python编程方式,即利用rc 方法。