Python 编程从入门到实践6
2018-04-04 本文已影响0人
蜘蛛的梦呓
终于把项目二看完了,只差项目三了就结束了,马上到清明,可能会不稳定更新。
16.2 制作世界人口地图: JSON 格式
world_pouplatation.py
import json
from Population_Map.country_codes import get_country_code
# 将数据加载到一个列表中
filename = 'population_data.json'
with open(filename) as f:
pop_data = json.load(f)
# 打印每个国家 2010 年的人口数量
for pop_dict in pop_data:
if pop_dict['Year'] == '2010':
country_name = pop_dict['Country Name']
# 16.2.3 将字符串转换为数字值
population = int(float(pop_dict['Value']))
# print(country_name + ': ' + str(population))
code = get_country_code(country_name)
# 如果返回了国别码,就打印国别码和人口数量,如果没有,就显示一条错误信息
if code:
print(code + ': ' + str(population))
else:
print('ERROR - ' + country_name)
16.2.4获取国别码
#countries.py
#Pygal 中的地图制作工具要求数据为特定的格式 : 用国码表示国家,以及用数字表示人口数量
from pygal_maps_world.i18n import COUNTRIES
for country_code in sorted(COUNTRIES.keys()):
print(country_code,COUNTRIES[country_code])
16.2.5 制作世界地图
# americas.py
import pygal
import pygal.maps.world
wm = pygal.maps.world.World()
wm.title = 'North,Central,and South America'
wm.add('North America', ['ca', 'mx', 'us'])
wm.add('Central America', ['bz', 'cr', 'gt', 'hn', 'ni', 'pa', 'sv'])
wm.add('South America', ['ar', 'bo', 'br', 'cl', 'co', 'ec', 'gf', 'gy', 'pe', 'py', 'sr', 'uy', 've'])
wm.render_to_file('americas.svg')
我们使用了 add() 方法,它接受一个标签和一个列表,其中厚着包含我们要突出的国家的国别码。
每次调用 add() 都将为指定的国家选择一种新颜色,并在图表左边显示该颜色和指定的标签
我们使用了 add() 方法,它接受一个标签和一个列表,其中厚着包含我们要突出的国家的国别码。
每次调用 add() 都将为指定的国家选择一种新颜色,并在图表左边显示该颜色和指定的标签。
16.2.6 在世界地图上呈现数字数据
import pygal.maps.world
# 显示三个北美国家的人口数量
wm = pygal.maps.world.World()
wm.title = 'Population of Countries in North America'
# Pygal 根据数字自动给不同国家着以深浅不一的颜色
wm.add('North America', {'ca': 34126000, 'us': 309349000, 'mx': 113423000})
wm.render_to_file('na_populations.svg')
16.2.7 绘制完整的世界人口地图
import pygal
from Population_Map.country_codes import get_country_code
from pygal.style import RotateStyle, LightColorizedStyle
filename = 'population_data.json'
with open(filename) as f:
pop_data = json.load(f)
# 创建一个包含人口数量的字典
cc_populations = {}
for pop_dict in pop_data:
if pop_dict['Year'] == '2010':
country_name = pop_dict['Country Name']
# 将字符串转换为数字值
population = int(float(pop_dict['Value']))
# print(country_name + ': ' + str(population))
code = get_country_code(country_name)
if code:
cc_populations[code] = population
# 根据人口数量将所有的国家分成三组
cc_pops_1, cc_pops_2, cc_pops_3 = {}, {}, {}
for cc, pop in cc_populations.items():
if pop < 10_000_000:
cc_pops_1[cc] = pop
elif pop < 1000_000_000:
cc_pops_2[cc] = pop
else:
cc_pops_3[cc] = pop
print(len(cc_pops_1), len(cc_pops_2), len(cc_pops_3))
# 16.2.9 使用Pygal设置世界地图的样式
# RotateStyle(),实参:十六进制的 RGB 颜色
# 使用RotateStyle设置颜色,并让 LightColorizedStyle 作为基本样式
wm_style = RotateStyle('#336699', base_style=LightColorizedStyle)
wm = pygal.maps.world.World(style=wm_style)
wm.title = 'World Population in 2010,by Country'
# Pygal 根据数字自动给不同国家着以深浅不一的颜色
wm.add('0-10m', cc_pops_1)
wm.add('10m-1bn', cc_pops_2)
wm.add('>1bn', cc_pops_3)
wm.render_to_file('world_population.svg')
17.1 使用 Web API
import requests
import pygal
from pygal.style import LightColorizedStyle as LCS, LightenStyle as LS
# 我们将编写一个程序,自动下载 Github 上星级最高的 Python 项目的信息
url = 'https://api.github.com/search/repositories?q=language:python&sort=stars'
r = requests.get(url)
print('Status code:', r.status_code)
# 17.1.5 处理响应结果
# 将 API 响应到存储到一个变量中
# json(): 返回json编码
response_dict = r.json()
# help(requests.models.Response.json)
print('Total repositories:', response_dict['total_count'])
# 17,2 使用 Pygal可视化仓库
# 探索有关仓库的信息
repo_dicts = response_dict['items']
print('Numner of item :', len(repo_dicts))
# 17.2.3 根据数据绘图
names, plot_dicts = [], []
for repo_dict in repo_dicts:
names.append(repo_dict['name'])
plot_dict = {
'value': repo_dict['stargazers_count'],
'label': str(repo_dict['description']),
#在图表中添加可单击的链接
'xlink':repo_dict['html_url']
}
plot_dicts.append(plot_dict)
# print('Repositories returned:', len(repo_dicts))
# print('Total repositories:', response_dict['total_count'])
# names, stars = [], []
#
# for repo_dict in repo_dicts:
# names.append(repo_dict['name'])
# stars.append(repo_dict['stargazers_count'])
# 可视化
# 17.2.1 改进 Pygal 图表
my_style = LS('#333366', base_style=LCS)
# 创建 Config 的实例并命名为 my_config,通过修改 my_config的属性,定制图表的外观
my_config = pygal.Config()
my_style = LS('#333366', base_style=LCS)
my_style.title_font_size = 24
my_style.label_font_size = 14
my_style.major_label_font_size = 18
my_config = pygal.Config()
my_config.x_label_rotation = 45
my_config.show_legend = False
my_config.truncate_label = 15
my_config.show_y_guides = False
my_config.width = 1000
chart = pygal.Bar(my_config, style=my_style)
chart.title = 'Most - Starred Python Projects on GitHub'
chart.x_labels = names
# 将标签设置为空字符串
# chart.add('', stars)
chart.add('', plot_dicts)
chart.render_to_file('python_rope.svg')
# 我们首先导入了 pygal 以及要应用于图标的 Pygal 样式,接下来,打印 API 调用响应的状态以及找到的仓库总数,
# 以便获悉 API 调用是否出现了问题,然后通过可视化来呈现这些信息。
# 生成图表,以便分析数据
# 研究第一个仓库
# repo_dict = repo_dicts[0]
# print('\nKeys:', len(repo_dict))
# for key in sorted(repo_dict.keys()):
# print(key)
# 处理结果
# print(response_dict.keys())
# 研究有关仓库的信息
# print('\nSelected information about first repository:')
# for repo_dict in repo_dicts:
# print('\nName:', repo_dict['name'])
# print('Owner:', repo_dict['owner']['login'])
# print('Stars:', repo_dict['stargazers_count'])
# print('Repository:', repo_dict['html_url'])
# print('Description:', repo_dict['descrpition'])
# 我们遍历 repo_dicts 中的所有字典。在这个循环中,我们打印每个项目的名称、所有者、星级、在 GitHub 上的 URL 以及描述
17.7.2 添加自定义工具提示
import pygal
from pygal.style import LightColorizedStyle as LCS, LightenStyle as LS
my_style = LS('#333366', base_style=LCS)
chart = pygal.Bar(style=my_style, x_label_rotation=45, show_legend=False)
chart.title = 'Python Projects'
chart.x_labels = ['httpie', 'django', 'flask']
plot_dicts = [
{'value': 16101, 'label': 'Description of httpie.'},
{'value': 15028, 'label': 'Description of django.'},
{'value': 14798, 'label': 'Description of flask.'},
]
chart.add('', plot_dicts)
chart.render_to_file('bar_descriptions.svg')
总的来说,就是利用爬虫知识爬取数据,以字典类型返回爬取的数据,然后把这些数据可视化,再根据自己的需求,配置可视化的格式,最后展现出来。