返回介绍

6.1 Matplotlib

发布于 2024-01-21 22:13:25 字数 4213 浏览 0 评论 0 收藏 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文