Python数学编程 第二章数据可视化 第三节 接上

2.3.2 绘制纽约市的年平均气温

我们来看一组稍大点儿的数据集,以便探索matplotlib的更多功能。2000 年至2012年间,纽约市年平均气温如下(单位为华氏度): 53.9,56.3,56.4,53.4,54.5,55.8,56.8,55.0,55.3,54.0,56.7,56.4,57.3 (这些气温是在中央公园测量得到的)。现在它们看起来就是一 组随机无规律的数字,但是我们可以在图上绘制这一组温度值,使各年的平均气温的升降情况更加清楚地展示出来:


 >>> nyc_temp = [53.9, 56.3, 56.4, 53.4, 54.5, 55.8, 56.8, 55.0, 55.3, 54.0, 56.7, 56.4, 57.3] >>> plot(nyc_temp, marker = 'o') []

我们将这个平均气温存储在名为nyc_temp的列表中,然后我们只传递这个列表和标记字符串来调用plot()函数。列表中传入单个列表时,会将这些值都绘制在y轴上。x轴的数值由列表每个元素的对应索引来填充,可以看到索引由0开始到12,即代表2000年到2012年13个年份。

输入show()函数显示图形,如下图。图中显示了纽约市2000年至2012年期间年平均气温的变化情况。我们发现,平均气温这些数字数值相差并不大,但是在图像上的波动取相当剧烈,原因在于matplotlib自动选择y的范围,使得图形可以包含绘图数据。所以,y轴从53.0开始,最高值为57.5,这使得微小的差异被放大。我们后面会学习如何控制各个轴的范围。

y轴上的数字是浮点数,x轴上的数是整数,matplotlib均能处理这两类数。

在不显示年份的情况下挥之温度图是一种简单快速的方法,可以直观地看到年份之间温度的变化。但是如果这张图要展示给别人,那么x轴就需要显示对应的年份才能让人看得清楚。所以我们可以建立一个年份列表,然后调用plot()函数来重新绘图。


 >>> nyc_temp = [53.9, 56.3, 56.4, 53.4, 54.5, 55.8, 56.8, 55.0, 55.3, 54.0, 56.7, 56.4, 57.3] >>> years = range(2000, 2013) >>> plot(years, nyc_temp, marker = 'o') [] >>> show()

这里使用了range()函数来显示x轴的年份。

2.3.3 比较纽约市的月平均气温

任然观察纽约市的数据,让我们看看过去几年每月的平均温度是如何变化的。我们还可以顺便了解到如何在单个图形上绘制多个线条。我们将选择其中三年:2000年、2006年和2012年。绘制这三年中12个月的平均气温。

首先,我们需要定义三个列表来存储这三个每月的平均气温。


 >>> nyc_temp_2000 = [31.3, 37.3,47.2, 51.0, 63.5, 71.3, 72.3, 72.7, 66.0, 57.0, 45.3, 31.1] >>> nyc_temp_2006 = [33.7, 38.1,45.2, 54.3, 59.5, 69.3, 72.3, 75.7, 65.0, 52.0, 44.1, 36.8] >>> nyc_temp_2012 = [37.3, 40.9,50.9, 54.3, 65.5, 71.3, 78.3, 76.7, 68.0, 58.0, 43.1, 41.8]

这三个列表分别对应2000年,2006年,2012年的每月平均气温。可以使用三个不同的图形来比较这三组数据,但是不易观察。

最直观的方法还是在同一个图形上来绘制三个数据集,如下


 >>> months = range(1, 13) >>> plot(months,nyc_temp_2000, months, nyc_temp_2006, months, nyc_temp_2012) [, , ]

首先,创建一个名为months的列表来存储1~12月份作为x轴数据,然后传入plot函数三对列表,每对均包含需要绘制的x轴数据和y轴数据。到目前为止,我们只在plot()函数中传入一对列表,事实上是可以传入多对列表来绘制多条曲线。

plot()函数来返回三个对象的列表,而不是一个,也就是说matplotlib认为这三条曲线是不同的,只是在调用show()函数时,要将这些线绘制在一起。我们调用show()来显示图形:

现在这个图形上面有三条线,Python自动为每个数据集来选择一种颜色,以便于区分。

我们也可以分别地调用三次plot()函数,因为matplotlib函数它会记住尚未显示出来的图形,然后将它们显示在同一个图形上。

然而,问题也随之出现了,我们并不知道哪种颜色的线条对应哪一年。为了解决这个问题,可以使用legend()函数,可以为图形添加一个图例。图里样式为一个小矩形框,用于表示图像的不同部分的含义。我们可以使用一个图例来区分三个彩色线条代表的年份。要添加图例,首先要调用plot()函数:


 >>> plot(months,nyc_temp_2000, months, nyc_temp_2006, months, nyc_temp_2012) [, , ]

然后,从pylab模块导入legend()函数,并且按如下方式进行调用:


 >>> from pylab import legend >>> legend([2000, 2006, 2012]) 

我们调用legend()函数,将表示图形的每条线的标签列表作为参数,并且这个标签列表的顺序与plot()传入的列表对有对应关系。也就是说,plot()中第一对列表对应2000,第二对列表对应2006,以此类推。我们也可以指定图例的位置,比如"lowet center"(中下)"center left(左中)"和"upper left"(左上),也可以设置为最佳"best",这样图例不会影响图形的展示。

然后,调用show()函数来进行显示:

如上图所示,在右上角的图例框中,告诉我们哪条线对应哪个年份。

对比分析这个图就比较简单直观,我们可以分析出一大堆结论,如每年的最高气温大概都在7,8月份、前半年温度一直是爬升趋势,后半年又骤降(几乎呈直线)。

2.3.5 自定义图形

我们了解了对一个图形添加图例。下面我们学习自定义一个图形,这将会涉及到向x、y轴添加标签,绘制标题,控制坐标轴的范围和步长等等。

(1)添加标题和标签

使用title()函数为图像添加标题,使用xlabel()和ylabel()函数为x、y轴添加标签。数据依然使用纽约三年平均气温:


 >>> from pylab import plot,show,title,xlabel,ylabel,legend >>> plot(months,nyc_temp_2000, months, nyc_temp_2006, months, nyc_temp_2012) [, , ] >>> title('Average monthly temperature in NYC') Text(0.5, 1.0, 'Average monthly temperature in NYC') >>> xlabel('Month') Text(0.5, 0, 'Month') >>> ylabel('Temperature') Text(0, 0.5, 'Temperature') >>> legend([2000, 2006, 2012]) 

调用title(),xlabel(),ylabel()三个函数,传入图像名称和x、y轴标签。调用show()显示图像可以看到,坐标轴标签和标题都已添加到图形中:

(2)自定义坐标轴

到目前为止,我们看到的都是基于提供给plot()函数的数据,Python自动确定坐标轴上的数据,这在大多数情况下是可以的,但有时这种自动确定的范围并不是最理想的呈现数据的方式。比如之前我们绘制的年平均气温变化图中,即使是微笑的文段变化看起来变化幅度也相当大。我们可以使用axis()函数来调整坐标轴的数值区间(此函数可用于获取当前范围以及为坐标轴设置新的数值区间)

再次考虑2000到2012年纽约市的年平均气温,并且绘制前面完成过的图形。


 >>> nyc_temp = [53.9, 56.3, 56.4, 53.4, 54.5, 55.8, 56.8, 55.0, 55.3, 54.0, 56.7, 56.4, 57.3] >>> plot(nyc_temp, marker='o')

导入axis()函数并且调用它


 >>> from pylab import axis >>> axis() (-0.6000000000000001, 12.6, 53.205, 57.495)

该函数返回一个元组,其中4个数字对应于x轴(-0.6000000000000001, 12.6)和y轴(53.205, 57.495)的范围,我么可以看到这个自动确定的范围似乎不是那么让人舒服。我们希望它的x轴,y轴从0开始:


 >>> axis(ymin=0) (-0.6000000000000001, 12.6, 0.0, 57.495) >>> axis(xmin=0) (0.0, 12.6, 0.0, 57.495) >>> show()

设置x、y轴的起始值(xmin=0,ymin=0),调用show()显示图形。此时,我们可以看到x、y轴的起始值为0,并且温度之间的差异不那么大了。

既然有xmin,、ymin那我们自然而然也就会想到有xmax、ymax来设置x、y轴的截至值,并且我们可以同时设置这四个值,直接将这4个值作为列表输入,调用axis()函数。例如axis([0,12,0,20]),这个操作设置x轴的范围为(0,12),y轴的范围为(0,20)

(3)使用pyplot绘图

pyplot模块可用于在交互式shell中创建绘图,例如IDLE shell,就像我们之前那样。然而每当不在IDLE shell中调用matplotlib时,对于一个大型程序的部分绘图代码,pyplot更有效率,不要担心,pyplot的所有方法与之前学的pypab一样。

shiyongpuplotmokuai来重新创建本章的第一个图形:


 ''' Simple plot using pyplot ''' import matplotlib.pyplot    # ①  def create_graph():         # ②     x_numbers = [1, 2, 3]     y_numbers = [4, 5, 6]      matplotlib.pyplot.plot(x_numbers, y_numbers)     matplotlib.pyplot.show()  if __name__ == '__main__':     create_graph()

首先,我们在0处使用import matplotlib.pyplot 语句导入pyplot模块,这意味着我们正在从matplotlib包那里导入整个pyplot模块。要引用此模块中定义的任何函数或类定义,你必须使用语法matplotlib.pyplot.item,其中item是要使用的函数或类。

这不同于我们之前学习过的一次导入单个函数或类。例如,在第一章中, 我们通过语句from fractions import Fraction导入Fraction类。当你要使用fractions 模块中的多个函数时,导入整个模块很有必要。相比于单独导入,我们一次性导入整个模块,以方便在需要时直接引用相应的函数。

在❷处的create graph()函数中,我们创建了要在图上绘制的两个数字列表,然后将这两个列表传递给plot()函数,与使用pylab的方法相同。然而,这一次,我们调用matplotlib.pyplot.plot()函数,这意味着我们正在调用matplotlib包的pyplot 模块中定义的plot()函数。 然后,我们调用show(函数来显示图形。绘图方法与我们之前所做的一样,唯一的区别在于调用这些函数的机制。 为了简化代码,我们可以通过输入import matplotib.pyplot as plt来导入pyplot模块。 然后,我们可以在程序中使用标签plt指代pyplot,而不必总是输入matplotlib.pyplot:


 ''' Simple plot using pyplot ''' import matplotlib.pyplot as plt  def create_graph():     x_numbers = [1, 2, 3]     y_numbers = [4, 5, 6]      plt.plot(x_numbers, y_numbers)     plt.show()  if __name__ == '__main__':     create_graph()

现在,我们可以使用matplotlib.pyplot的别名或者缩写plt来调用函数。

在本章和其他后续的学习内容中,在交互式shell中使用pylab,否则使用pyplot。

2.3.5 保存图形

如果需要保存图形,我们可以使用savefig()函数。此函数将图形保存为图像文件,可以在报告或者演示文稿中使用。你可以选择多种图像格式,包括PNG、PDF、SVG。

下面进行演示:


 >>> from pylab import plot, savefig >>> x = [1, 2, 3] >>> y = [4, 5, 6] >>> plot(x, y) >>> savefig('mygraph.png')

该程序将图形保存到当前目录的图像文件中(文件名为mygraph.png)。 在Windows系统中,通常保存到C:Python33 (安装Python的地方)。在Linux系统中,当前目录通常是你的主目录(/ home / ),其中是你登录的用户。在Mac上,IDLE默认将文件保存到~/ Documents。 如果要将文件保存在不同的目录下,请指定完整的路径名。例如,要把图形以mygraph.png 的名字保存在Windows中的路径C:\下,可以这样调用savefig()函数:


 >>> savefig('C:\mygraph.png')

如果在图像浏览程序中打开文件,你将看到和调用show()函数一样的图形(你会注意到打开的文件只包含图形,而不是像调用show()函 数那样弹出整个窗口)。要指定不同的图像格式,只需使用相应的扩展名命名文件。例如,mygraph.svg 将创建一个SVG图像文件。 保存图形的另一种方法是在调用show(时使用弹出窗口中的Save (保存)按钮。



发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章