第41单元 使用 PyPlot 进行基本绘图
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论