接着上节继续学习,在本章中,你将从网上下载数据,并对这些数据进行可视化。网上的数据多得难以置信,且大多未经过仔细检查。如果能够对这些数据进行分析,你就能发现别人没有发现的规律和关联。我们将访问并可视化以两种常见格式存储的数据:CSV 和 JSON。我们将使用 Python 模块 csv 来处理以 CSV(逗号分隔的值)格式存储的天气数据,找出两个不同地区在一段时间内的最高温度和最低温度。然后,我们将使用 matplotlib 根据下载的数据创建一个图表,展示两个不同地区的气温变化:阿拉斯加锡特卡和加利福尼亚死亡谷。在本章的后面,我们将使用模块 json 来访问以 JSON 格式存储的人口数据,并使用 Pygal 绘制一幅按国别划分的人口地图。
要在文本文件中存储数据,最简单的方式是将数据作为一系列以逗号分隔的值(CSV)写入文件。这样的文件称为 CSV 文件。例如,下面是一行 CSV 格式的天气数据:2014-1-5,61,44,26,18,7,-1,56,30,9,30.34,30.27,30.15,,,,10,4,,0.00,0,,195
csv 模块包含在 Python 标准库中,可用于分析 CSV 文件中的数据行,让我们能够快速提取感兴趣的值。下面先来查看这个文件的第一行,其中包含一系列有关数据的描述:
- import csv
- filename = 'sitka_weather_07-2014.csv'
- with open(filename) as f :
- reader = csv.reader(f)
- header_row = next(reader)
- print(header_row)
(1)调用 csv.reader(),并将前面存储的文件对象作为实参传递给它,从而创建一个与该文件相关联的阅读器(reader)对象。我们将这个阅读器对象存储在 reader 中。
(2)模块 csv 包含函数 next(),调用它并将阅读器对象传递给它时,它将返回文件中的下一行。在前面的代码中,我们只调用了 next() 一次,因此得到的是文件的第一行,
结果如下:['AKDT', 'Max TemperatureF', 'Mean TemperatureF', 'Min TemperatureF', 'Max Dew PointF', 'MeanDew PointF', 'Min DewpointF', 'Max Humidity', 'Mean Humidity', 'Min Humidity', 'Max Sea Level PressureIn', 'Mean Sea Level PressureIn', 'Min Sea Level PressureIn', 'Max VisibilityMiles', 'Mean VisibilityMiles', 'Min VisibilityMiles', 'Max Wind SpeedMPH', 'Mean Wind SpeedMPH', 'Max Gust SpeedMPH', 'PrecipitationIn', 'CloudCover', 'Events', 'WindDirDegrees']
这个 csv 文件时这样的。
为让文件头数据更容易理解,将列表中的每个文件头及其位置打印出来:
- import csv
- filename = 'sitka_weather_07-2014.csv'
- with open(filename) as f :
- reader = csv.reader(f)
- header_row = next(reader)
- for index,column_header in enumerate(header_row):
- print(index,column_header)
结果如下:
知道需要哪些列中的数据后,我们来读取一些数据。首先读取每天的最高气温:
- import csv
- filename = 'sitka_weather_07-2014.csv'
- with open(filename) as f :
- reader = csv.reader(f)
- header_row = next(reader)
- #for index,column_header in enumerate(header_row):
- # print(index,column_header)
- highs=[]
- for row in reader :
- high = int(row[1])
- highs.append(high)
- print(highs)
结果如下图:
[64, 71, 64, 59, 69, 62, 61, 55, 57, 61, 57, 59, 57, 61, 64, 61, 59, 63, 60, 57, 69, 63, 62, 59, 57, 57, 61, 59, 61, 61, 66]
- import csv
- from matplotlib import pyplot as plt
- filename = 'sitka_weather_07-2014.csv'
- with open(filename) as f :
- reader = csv.reader(f)
- header_row = next(reader)
- #for index,column_header in enumerate(header_row):
- # print(index,column_header)
- highs=[]
- for row in reader :
- high = int(row[1])
- highs.append(high)
- print(highs)
- fig = plt.figure(dpi=128,figsize=(10,6))
- plt.plot(highs,c="red")
- #设置图形的格式
- plt.title("Daily high temperatures,July 2014,", fontsize=24)
- plt.xlabel("",fontsize=16)
- plt.ylabel("Temperature(F)",fontsize=16)
- plt.tick_params(axis="both",which ="major",labelsize=16)
- plt.show()
结果如下图:
首先导入了模块 datetime 中的 datetime 类,然后调用方法 strptime(),并将包含所需日期的字符串作为第一个实参。第二个实参告诉 Python 如何设置日期的格式。在这个示例中,'%Y-'让 Python 将字符串中第一个连字符前面的部分视为四位的年份;'%m-'让 Python 将第二个连字符前面的部分视为表示月份的数字;而'%d'让 Python 将字符串的最后一部分视为月份中的一天(1~31)。
方法 strptime() 可接受各种实参,并根据它们来决定如何解读日期。一下列出了其中一些这样的实参:
知道如何处理 CSV 文件中的日期后,就可对气温图形进行改进了,即提取日期和最高气温,并将它们传递给 plot(),如下所示:
- import csv
- from matplotlib import pyplot as plt
- from datetime import datetime
- filename = 'sitka_weather_07-2014.csv'
- with open(filename) as f :
- reader = csv.reader(f)
- header_row = next(reader)
- #for index,column_header in enumerate(header_row):
- # print(index,column_header)
- #从文件中获取日期和最高气温
- dates,highs=[],[]
- for row in reader :
- current_date = datetime.strptime(row[0],"%m/%d/%Y")
- dates.append(current_date)
- high = int(row[1])
- highs.append(high)
- print(highs)
- fig = plt.figure(dpi=128,figsize=(10,6))
- plt.plot(dates,highs,c="red")
- #设置图形的格式
- plt.title("Daily high temperatures,July 2014,", fontsize=24)
- plt.xlabel("",fontsize=16)
- fig.autofmt_xdate()
- plt.ylabel("Temperature(F)",fontsize=16)
- plt.tick_params(axis="both",which ="major",labelsize=16)
- plt.show()
我们创建了两个空列表,用于存储从文件中提取的日期和最高气温(见)。然后,我们将包含日期信息的数据(row[0])转换为 datetime 对象,并将其附加到列表 dates 末尾。我们将日期和最高气温值传递给 plot()。我们调用了 fig.autofmt_xdate() 来绘制斜的日期标签,以免它们彼此重叠。下图显示了改进后的图表。
改进后的图表显示了大量意义深远的数据,但我们可以在其中再添加最低气温数据,使其更有用。为此需要从数据文件中提取最低气温,并将它们添加到图表中,如下所示:
- import csv
- from matplotlib import pyplot as plt
- from datetime import datetime
- filename = 'sitka_weather_2014.csv'
- with open(filename) as f :
- reader = csv.reader(f)
- header_row = next(reader)
- #for index,column_header in enumerate(header_row):
- # print(index,column_header)
- #从文件中获取日期和最高气温,最低气温
- dates,highs,lows=[],[],[]
- for row in reader :
- current_date = datetime.strptime(row[0],"%Y-%m-%d")
- dates.append(current_date)
- low=int(row[3])
- lows.append(low)
- high = int(row[1])
- highs.append(high)
- # print(highs)
- fig = plt.figure(dpi=128,figsize=(10,6))
- plt.plot(dates,highs,c="red")
- plt.plot(dates,lows,c="blue")
- #设置图形的格式
- plt.title("Daily high temperatures - 2014,", fontsize=24)
- plt.xlabel("",fontsize=16)
- fig.autofmt_xdate()
- plt.ylabel("Temperature(F)",fontsize=16)
- plt.tick_params(axis="both",which ="major",labelsize=16)
- plt.show()
效果图如下:
添加两个数据系列后,我们就可以了解每天的气温范围了。下面来给这个图表做最后的修饰,通过着色来呈现每天的气温范围。为此,我们将使用方法 fill_between(),它接受一个 x 值系列和两个 y 值系列,并填充两个 y 值系列之间的空间:
- plt.plot(dates,highs,c="red",alpha=0.5)
- plt.plot(dates,lows,c="blue",alpha=0.5)
- plt.fill_between(dates,highs,lows,facecolor="blue",alpha=0.1)
(1)实参 alpha 指定颜色的透明度。Alpha 值为 0 表示完全透明,1(默认设置)表示完全不透明。通过将 alpha 设置为 0.5,可让红色和蓝色折线的颜色看起来更浅。
(2)我们向 fill_between() 传递了一个 x 值系列:列表 dates,还传递了两个 y 值系列:highs 和 lows。
(3)实参 facecolor 指定了填充区域的颜色,我们还将 alpha 设置成了较小的值 0.1,让填充区域将两个数据系列连接起来的同时不分散观察者的注意力。
(4)显示了最高气温和最低气温之间的区域被填充的图表如下:
未完待续!元旦三天小长假已经来了,祝大家元旦快乐!
来源: https://www.cnblogs.com/majianchao/p/8149758.html