返回介绍

第41单元 使用 PyPlot 进行基本绘图

发布于 2024-01-28 22:01:16 字数 2934 浏览 0 评论 0 收藏 0

matplotLib模块(更明确地,也就是其子模块pyplot)提供了针对numpy和pandas的绘图。

通过调用NIAAA的酒精监控报告来开始我们的试验。在第31单元我们已经将该报告转换为frame,接下来我们将绘制各个州每种酒的消费量。可惜的是,增量绘图系统没有一个能完成所有绘图的函数,让我们来看一个完整的例子:

pyplot-images.py

import matplotlib, matplotlib.pyplot as plt
import pickle, pandas as pd

# 在此之前NIAAA frame已完成了pickle操作
alco = pickle.load(open("alco.pickle", "rb"))
del alco["Total"]
columns, years = alco.unstack().columns.levels

# 直接从文件中读出州的缩略语
states = pd.read_csv(
    "states.csv",
    names=("State", "Standard", "Postal", "Capital"))
states.set_index("State", inplace=True)

# 将酒的销量按2009年的统计数据排序
frames = [pd.merge(alco[column].unstack(), states,
                   left_index=True, right_index=True).sort_values(2009)
          for column in columns]

# 有多少年的数据?
span = max(years) - min(years) + 1

代码首先导入了所有必要的模块和frame。然后将NIAAA数据和州名的缩写组合成一个frame,并通过酒的种类将其分成三个单独的frame。下面的代码片段负责绘图。

pyplot-images.py

    # 选择一种优美的绘图样式
    matplotlib.style.use("ggplot")

    STEP = 5
    # 一个frame绘制在一幅子图中
    for pos, (draw, style, column, frame) in enumerate(zip(
❶           (plt.contourf, plt.contour, plt.imshow),
            (plt.cm.autumn, plt.cm.cool, plt.cm.spring),
            columns, frames)):

        # 选中第2行第2列的子图
❷       plt.subplot(2, 2, pos + 1)

        # 绘制frame
❸       draw(frame[frame.columns[:span]], cmap=style, aspect="auto")


        # 加入图饰
❹       plt.colorbar()
        plt.title(column)
        plt.xlabel("Year")
        plt.xticks(range(0, span, STEP), frame.columns[:span:STEP])
        plt.yticks(range(0, frame.shape[0], STEP), frame.Postal[::STEP])
        plt.xticks(rotation=-17)

函数imshow()、contour()和contourf()(标记为❶处)分别将矩阵显示为图像、等高线图和填充等高线图。不要在同一个子图中使用这三个函数(或任何其他绘图函数),因为它们会在先前绘制的图上叠加新的绘图,除非这正是你想要的。可选参数cmap(标记为❷处)为绘图指定了一个预制调色板(彩色图)。

可以将相同或不同类型的几个子图包装成一个主图(标记为❸处)。函数subplot(n, m, number)将主图划分为n个虚拟行和m个虚拟列,并用number选择子图编号。子图从第1列开始先逐列编号,再逐行编号。(左上角的子图为1,右侧的下一子图为2,以此类推。)所有绘图命令只影响最新选中的子图。

请注意,图像的原点在左上角,Y轴是指向下的(这是计算机图形学中的绘图方式),但其他所有图形的原点均位于左下角,而Y轴是指向上的(这是数学中的绘图方式)。另外,具有相同数据的图像和等高线图在默认情况下具有不同的纵横比,不过你可以通过传递aspect="auto"选项使它们看起来比较接近。

函数colorbar()、title()、xlabel()、ylabel()、grid()、xticks()、yticks()和tick_params()(标记为❹处)可以将相应的装饰添加到绘图中。(我们将在第43单元中重新考察这些函数。)grid()函数实际上实现了网格的打开和关闭,所以图形是否具有网格取决于你起初是否使用了grid()函数,而这反过来又受到绘图风格的控制。

函数tight_layout()可以调整子图,使它们看起来美观和紧凑。让我们来看看绘图的结果:

pyplot-images.py

plt.tight_layout()
plt.savefig("../images/pyplot-all.pdf")
#plt.show()

函数savefig()将当前图形保存到文件中。该函数的第一个参数是文件名或已打开文件的句柄。如果传递的是文件名,savefig()会尝试通过文件的扩展名猜测图像格式。该函数支持多种流行的图像文件格式,但GIF除外。

函数show()将绘图显示在屏幕上。它同时也清空了画布,但如果你只想清空画布,那就单独调用clf()函数。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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