6.1 Matplotlib
Matplotlib是Python中最著名的绘图库。其子库pyplot包含大量与MATLAB相似的函数调用接口,这种函数式编程的思想非常适合进行交互式制图,如代码清单6-1所示。条形图、扇形图、散点图、等高线图等二维或三维图形都是它的拿手好戏(见图6-1)。
代码清单6-1 函数式绘图
# -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 10, 1000) y = np.sin(x) z = np.cos(x**2) plt.figure(figsize=(8,4)) plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2) plt.plot(x,z,"b--",label="$cos(x^2)$") plt.xlabel("Time(s)") plt.ylabel("Volt") plt.title("PyPlot First Example") plt.ylim(-1.2,1.2) plt.legend() plt.show()
*代码详见:示例程序/code/6-1.py
图6-1 函数式编程示例
它的官方文档多达几百页,相当完备,并在“画廊(Gallery)[1] ”中附有上百幅示例图及对应源代码。这对于新手非常友好。你可以在其中找到同个类型的图片,并尝试修改对应代码进行创作,如图6-2所示。
图6-2 Matplotlib官方文档剪影
Matplotlib这一节作为Matplotlib的入门介绍,将通过一个综合绘图示例来理解和学习Matplotlib函数式绘图中所涉及的基本概念。
首先介绍的概念是“子图”,如图6-3所示。它允许用户将多幅图同时绘制到一个图片窗口之中。这能节省空间,同时允许用户从多个角度展示和解读数据,在数据可视化任务中非常实用。
图6-3 子图效果展示
在函数式绘图中,任何的绘图对象都被看作是一条函数产生的结果。因此,达到这个效果的代码非常简单,如代码清单6-2所示。
代码清单6-2 子图的声明方法
# -*- coding:utf-8 -*- import matplotlib.pylab as plt import numpy as np # 第一部分 plt.subplot(2,1,1) # 参数依次为:行,列,第几项 # 第二部分 plt.subplot(2,2,3) # 第三部分 plt.subplot(2,2,4) plt.show()
*代码详见:示例程序/code/6-1.py
接下来,只需要将绘图代码插入两个部分之间,图像就会在用户指定的位置出现。准确地说,插入子图绘制方法plt.subplot()之间,如代码清单6-3所示。
代码清单6-3 绘制子图1——柱状图
# -*- coding:utf-8 -*- import matplotlib.pylab as plt import numpy as np # 第一部分 plt.subplot(2,1,1) # 参数依次为:行,列,第几项 n = 12 X = np.arange(n) Y1 = (1-X/float(n)) * np.random.uniform(0.5,1.0,n) Y2 = (1-X/float(n)) * np.random.uniform(0.5,1.0,n) # 利用 plt.bar(x, y)绘制柱状图,并指定柱状图颜色,柱子边框颜色 plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white') plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white') for x, y in zip(X,Y1): # 利用 plt.text()指定文字出现的坐标和内容 plt.text(x+0.4, y+0.05, '%.2f' % y, ha='center', va= 'bottom') # 利用 plt.ylim(y1, y2)限制图形打印时对应的纵坐标范围 plt.ylim(-1.25,+1.25) # 第二部分 plt.subplot(2,2,3) # 第三部分 plt.subplot(2,2,4) plt.show()
*代码详见:示例程序/code/6-1.py
由代码清单6-3可以看出,利用Matplotlib的子库pyplot绘制图形时,与MATLAB中函数式绘图的风格非常相似。无论你需要的是一个柱状图,还是显示在图片上的文字,甚至是控制坐标轴的范围,都通过传递参数给对应的绘图函数的方式来实现。此时,图形的表现力更加丰富了,如图6-4所示。
图6-4 子图绘制——加入柱状图
类似地,我们继续加入饼状图绘制代码和三角函数曲线绘制代码,如代码清单6-4所示。饼状图和曲线图结果如图6-5所示。值得一提的是:plt.xticks(),plt.yticks()能够改变坐标轴的刻度文字。通常情况下,绘制三角函数曲线时,我们更加关心π及其倍数的对应取值,而非原始的坐标刻度1,2,3……
代码清单6-4 加入饼状图和曲线图
# -*- coding:utf-8 -*- import matplotlib.pylab as plt import numpy as np # 省略第一部分代码 # 第二部分 plt.subplot(2,2,3) n = 20 Z = np.random.uniform(0,1,n) plt.pie(Z) # 第三部分 plt.subplot(2,2,4) X = np.linspace(-np.pi, np.pi, 256,endpoint=True) Y_C, Y_S = np.cos(X), np.sin(X) plt.plot(X, Y_C, color="blue", linewidth=2.5, linestyle="-") plt.plot(X, Y_S, color="red", linewidth=2.5, linestyle="-") plt.xlim(X.min()*1.1, X.max()*1.1) plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$']) plt.ylim(Y_C.min()*1.1, Y_C.max()*1.1) plt.yticks([-1, 0, +1], [r'$-1$', r'$0$', r'$+1$']) plt.show()
*代码详见:示例程序/code/6-1.py
图6-5 子图绘制——加入饼状图和曲线图
限于篇幅,我们仅能通过一个简单的例子向读者介绍Matplotlib中最简单的使用方法和思想。如果读者有更迫切的绘图或数据可视化需求,还请移步到Matplotlib的“画廊(Gallery)”页面去欣赏和发掘更符合表达需求的图例。单击对应的图片便可查看源代码。
但为避免误导读者,必须澄清一点:函数式绘图的思想绝不是Matplotlib的全部。它同样拥有面向对象式的绘图方法。尽管函数式绘图能快速出图,但有以下缺点需要指出:
1)函数调用的方法影响效率。
2)图形与内容之间的从属关系被传递函数的方式所掩盖,降低了代码的可读性。
3)对于开发者而言,不能直接接触对象,操作对象的数据是致命的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论