16-2  比较锡特卡和死亡谷的气温 :在有关锡特卡和死亡谷的图表中,气温刻度反映了数据范围的不同。为准确地比较锡特卡和死亡谷的气温范围,需要在 y  轴上使用相同的刻度。为此,请修改图 16-5 和图 16-6 所示图表的 y  轴设置,对锡特卡和死亡谷的气温范围进行直接比较(你也可以对任何两个地方的气温范围进行比较)。你还可以尝试在一个图表中呈现这两个数据集。
16-3  降雨量 :选择你感兴趣的任何地方,通过可视化将其降雨量呈现出来。为此,可先只涵盖一个月的数据,确定代码正确无误后,再使用一整年的数据来运行它。

实现例子效果如下图:

代码:

import csv
from datetime import datetime
from matplotlib import pyplot as plt
filename_sitka = 'data/sitka_weather_2014.csv'
filename_death = 'data/death_valley_2014.csv'# 获取日期、最高温度、最低温度、日降水量
def get_data(filename):with open(filename) as f:reader = csv.reader(f)header_row = next(reader)# print(header_row)dates, highs, lows, precipitationIns = [], [], [], []for row in reader:try:current_date = datetime.strptime(row[0], "%Y-%m-%d")high = int(row[1])low = int(row[3])precipitationIn = float(row[19])except ValueError:print(current_date, 'missing data')else:dates.append(current_date)highs.append(high)lows.append(low)precipitationIns.append(precipitationIn)return {'dates': dates, 'highs': highs, 'lows': lows, 'precipitationIns': precipitationIns}sitka_data = get_data(filename_sitka)
death_data = get_data(filename_death)#  根据数据绘制图形
fig = plt.figure(dpi=128, figsize=(10, 6))
plt.plot(sitka_data['dates'], sitka_data['highs'], c='red', alpha=1)
plt.plot(sitka_data['dates'], sitka_data['lows'], c='blue', alpha=1)
plt.plot(sitka_data['dates'], sitka_data['precipitationIns'], c='green', alpha=1)plt.plot(death_data['dates'], death_data['highs'], c='red', alpha=1)
plt.plot(death_data['dates'], death_data['lows'], c='blue', alpha=1)
plt.plot(death_data['dates'], death_data['precipitationIns'], c='green', alpha=1)# plt.fill_between(sitka_data['dates'], sitka_data['highs'], sitka_data['lows'], facecolor='red', alpha=0.1)
# plt.fill_between(death_data['dates'], death_data['highs'], death_data['lows'], facecolor='blue', alpha=0.1)
#  设置图形的格式
title = "Daily high and low temperatures - 2014\nDeath Valley, CA"
plt.title(title, fontsize=20)
plt.xlabel('', fontsize=16)
# 绘制斜的日期标签
fig.autofmt_xdate()
plt.ylabel("Temperature (F)", fontsize=16)
plt.tick_params(axis='both', which='major', labelsize=16)
# 图例
plt.legend(('high', 'low', 'precipitationIn'))plt.show()

16-4  探索 :生成一些图表,对你好奇的任何地方的其他天气数据进行研究。

实现例子效果如下图:

代码:

import csv
from datetime import datetime
from matplotlib import pyplot as plt
filename_sitka = 'data/sitka_weather_2014.csv'with open(filename_sitka) as f:reader = csv.reader(f)header_row = next(reader)dates, humiditys, cloudcovers = [], [], []for row in reader:try:current_date = datetime.strptime(row[0], "%Y-%m-%d")humidity = int(row[7])cloudcover = int(row[20])except ValueError:print(current_date, 'missing data')else:dates.append(current_date)humiditys.append(humidity)cloudcovers.append(cloudcover)fig = plt.figure(dpi=128, figsize=(10, 6))
# 显示图表
plt.scatter(dates, humiditys, c='#d4237a', edgecolor='none', s=40)
plt.scatter(dates, cloudcovers, c='#13227a', edgecolor='none', s=40)
# 设置图表标题并给坐标轴加上标签
#   日期斜显示
plt.title('Data Analysis', fontsize=24)
fig.autofmt_xdate()
plt.xlabel('', fontsize=14)
plt.ylabel('', fontsize=14)
# 设置刻度标记的大小
plt.tick_params(axis='both', which='major', labelsize=14)
# 图例(文本、文本大小、显示位置、圆点和文本距离)
plt.legend(('humiditys', 'cloudcovers'), fontsize=10, loc='upper right', handletextpad=0.5)plt.show()

16-5  涵盖所有国家 :本节制作人口地图时,对于大约 12 个国家,程序不能自动确定其两个字母的国别码。请找出这些国家,在字典 COUNTRIES 中找到它们的国别码;然后,对于每个这样的国家,都在 get_country_code() 中添加一个 if-elif 代码块,以返回其国别码:
if country_name == 'Yemen, Rep.'
return 'ye'
elif --snip--
将这些代码放在遍历 COUNTRIES 的循环和语句 return None 之间。完成这样的修改后,你看到的地图将更完整。
16-6  国内生产总值 : Open Knowledge Foundation 提供了一个数据集,其中包含全球各国的国内生产总值( GDP ),可在 http://data.okfn.org/data/core/gdp/  找到这个数据集。请下载这个数据集的 JSON 版本,并绘制一个图表,将全球各国最近一年的 GDP 呈现出来。

数据下载地址效果图:

实现例子效果如下图:

代码:

country_codes.py(用来返回国别码,这里只处理了‘Yemen’情况,其它11个未确定的国别码可根据else的数据自行修改)。

from pygal_maps_world.i18n import COUNTRIES
def get_country_code(country_name):""" 根据指定的国家,返回 Pygal 使用的两个字母的国别码 """for code, name in COUNTRIES.items():if country_name.find('Yemen') >= 0:return 'ye'elif name == country_name:return codeelse:# 输出未确定国别码的国家print(country_name)#  如果没有找到指定的国家,就返回 Nonereturn None

world_gdp.py(生成svg图表)。

因为pygal.i18n已经不存在了,改成了 pygal_maps_world,所以直接使用文章的“from pygal.i18n import COUNTRIES”会报错;

命令终端执行pip install pygal_maps_world,然后改成import pygal_maps_world.maps和wm = pygal_maps_world.maps.World()后可正常绘制图表。

import json
from country_codes import get_country_code
import pygal_maps_world.maps
from pygal.style import LightColorizedStyle as LCS, RotateStyle as RS#  将数据加载到一个列表中
filename = 'data/gdp_json.json'
with open(filename) as f:gdp_data = json.load(f)
#  创建一个包含gdp数据的字典
cc_gdp = {}
for gdp_dict in gdp_data:if gdp_dict['Year'] == 2016:country = gdp_dict['Country Name']gdpValue = int(float(gdp_dict['Value']))code = get_country_code(country)if code:cc_gdp[code] = gdpValue#  根据gdp将所有的国家分成三组
cc_gdp_1, cc_gdp_2, cc_gdp_3 = {}, {}, {}
for cc, gdp in cc_gdp.items():if gdp < 10000000000:cc_gdp_1[cc] = gdpelif gdp < 500000000000:cc_gdp_2[cc] = gdpelse:cc_gdp_3[cc] = gdp
#  看看每组分别包含多少个国家
print(len(cc_gdp_1), len(cc_gdp_2), len(cc_gdp_3))
wm_style = RS('#d95e07', base_style=LCS)
wm = pygal_maps_world.maps.World(style=wm_style)
wm.title = 'World GDP in 2016, by Country'
wm.add('0-10bn', cc_gdp_1)
wm.add('10bn-500bn', cc_gdp_2)
wm.add('>500bn', cc_gdp_3)
wm.render_to_file('data/world_gdp.svg')

16-7  选择你自己的数据 :世界银行( The World Bank )提供了很多数据集,其中包含有关全球各国的信息。请访问 http://data.worldbank.org/indicator/  ,并找到一个你感兴趣的数据集。单击该数据集,再单击链接 Download Data 并选择 CSV 。你将收到三个 CSV 文件,其中两个包含字样 Metadata ,你应使用第三个 CSV 文件。编写一个程序,生成一个字典,它将两个字母的 Pygal 国别码作为键,并将你从这个文件中选择的数据作为值。使用 Worldmap 制作一个地图,在其中呈现这些数据,并根据你的喜好设置这个地图的样式。

数据下载地址效果图:

实现例子效果如下图:

代码:

country_codes.py(用来返回国别码,代码跟上面一样)。

children_out_school.py(生成svg图表)。

import csv
from country_codes import get_country_code
import pygal_maps_world.maps
from pygal.style import LightColorizedStyle as LCS, RotateStyle as RS#  将数据加载到一个列表中
filename = 'data/children_out_school.csv'
with open(filename) as f:reader = csv.reader(f)header_row = next(reader)#  创建一个包含gdp数据的字典children_numbers = {}for row in reader:try:country_name = row[0]children_number = int(row[60])except ValueError:print(country_name, 'missing data')else:code = get_country_code(country_name)if code:children_numbers[code] = children_number#  根据数量将所有的国家分成三组
children_number_1, children_number_2, children_number_3 = {}, {}, {}
for i, value in children_numbers.items():if value < 1000:children_number_1[i] = valueelif value < 10000:children_number_2[i] = valueelse:children_number_3[i] = value
#  看看每组分别包含多少个国家
print(len(children_number_1), len(children_number_2), len(children_number_3))
wm_style = RS('#d95e07', base_style=LCS)
wm = pygal_maps_world.maps.World(style=wm_style)
wm.title = 'Children Out School in 2018, by Country'
wm.add('0-1000', children_number_1)
wm.add('1000-10000', children_number_2)
wm.add('>10000', children_number_3)
wm.render_to_file('data/children_numbers.svg')

【Python编程:从入门到实践】第十六章练习题相关推荐

  1. 《Python编程从入门到实践》第六章

    第六章开始把一些需要注意的点写进注释里了. #在2020.10.23至2020.10.25结束之前完成第六章的学习 alien_0 = {'color':'green','points':5} pri ...

  2. Python 编程从入门到实践 第十二章 飞船开始游戏时靠着边界的问题解决办法

    注:图中标识的1,2,3,4 就是所指向的那一行代码,上面是本人的正确代码 解决办法:书上的代码内容顺序是1代码在2代码的前面,其实只要把1代码放到2代码后面就可以解决靠边的问题 飞船初始靠边原因:1 ...

  3. python编程从入门到实践,第七章练习题

    7-1 汽车租赁 :编写一个程序,询问用户要租赁什么样的汽车,并打印一条消息,如"LetmeseeifIcan find you a Subaru". cat=input(&quo ...

  4. python课本第三章答案idle_第三天任务 (【基于Python编程从入门到实践】第三章 列表 书本及动手试一试)...

    3.1列表什么是列表 列表是由 一系列特定顺序排列的元素组成的 用方括号[]来表示列表 并用逗号来分隔其中的元素 访问列表元素 索引指定访问的列表元素 使用列表中的各个值 3--1 动手试一试 3.1 ...

  5. 《Python编程从入门到实践》第10章文件和异常动手试一试答案(附代码)

    目录 10-3 访客 10-4 访客名单 10-6 加法运算 10-7 加法计算器 10-8 猫和狗 10-9 沉默的猫和狗 10-3 访客 #!/usr/bin/env python # -*- c ...

  6. 《Python编程从入门到实践》第9章类动手试一试答案(附代码)

    目录 9-1(9-2) 餐馆 9-3 用户 9-4 就餐人数 9-5 尝试登陆次数 9-6 冰淇淋小店 9-7 管理员 9-8 权限 9-10 导入Restaurant类 9-11 导入Admin类 ...

  7. 《Python编程从入门到实践》_第二章_变量和简单数据类型

    什么是变量 举例: >>> message = "Hello,Python!" >>> print (message) Hello,Python ...

  8. 《Python编程从入门到实践》第五章414

    5-1 条件测试 5-2 更多的条件测试 5-3 外星人颜色 #1 5-4 外星人颜色 #2 5-5 外星人颜色 #3 5-6 人生的不同阶段 5-7 喜欢的水果 5-8 以特殊方式跟管理员打招呼 5 ...

  9. Python编程-从入门到实践 Chapter19 第19章 创建用户账户的坑

    这次的坑在登录页面的19.2.2小节 书中代码略 书中代码转换成Django2.0版本如下: """为应用程序users定义URL模式""" ...

  10. Python编程从入门到实践,第7章练习:7-1~7-10

    练习 7-1: 汽车租赁 编写一个程序,询问用户要租赁什么样的汽车,并打印一条消息. 输出结果: 练习7-2: 餐位订位 编写一个程序,询问用户有多少人用餐.如果超过8位,就打印一条消息,指出没有空桌 ...

最新文章

  1. centos6.5下系统编译定制iptables防火墙扩展layer7应用层访问控制功能及应用限制QQ2016上网...
  2. 《Flume日志收集与MapReduce模式》一2.2 Flume配置文件概览
  3. php 文件加载方式
  4. nutch源代码阅读心得
  5. 在 Google Earth 上看新闻
  6. 翻译练习:计算机网络
  7. 如何调试CSS的跨浏览器样式bug
  8. HiJson(Json格式化工具)64位中文版下载 v2.1.2
  9. 基于Java的超市水果管理系统_技术分享 - 基于JAVA SWING结合链表的水果超市管理系统...
  10. 生成田字格模板(word)
  11. 吹气球--记忆化搜索
  12. 个性测试:跟乐嘉学性格色彩(图)
  13. 经常用电脑,要注意脸部保养
  14. Qt开发之路59---QPushButton的pressed,released,clicked,toggled响应的区别
  15. MySQL 不等于的三种表示及区别
  16. Android 使用 MediaCodec API音频播放器
  17. Spark 连接hive local
  18. Java实现后端生成excel表格模板--下拉框实现
  19. 日均调用量超13亿次,阿里达摩院研发全球首个实时翻译直播-1
  20. 研一学习笔记-小白NLP入门学习笔记

热门文章

  1. [!] Gradle threw an error while downloading artifacts from the network. Retrying to download... Runn
  2. 阈值处理(Threshold processing)
  3. 拆弹专家(密码BFS)
  4. Thinkpad预装win10硬盘分区
  5. android Acitvity action,flag和category各个参数的说明 .
  6. Python教程:利用百度API进行批量图片OCR识别
  7. 传奇地图时间限制脚本_地图时间限制脚本
  8. Vue上传图片裁剪预览插件vue-img-cutter的使用
  9. uniapp 定位服务_uniapp使用高德地图定位
  10. 【2014-3】day3 T1 五彩斑斓