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')

总的来说,就是利用爬虫知识爬取数据,以字典类型返回爬取的数据,然后把这些数据可视化,再根据自己的需求,配置可视化的格式,最后展现出来。

上一篇下一篇

猜你喜欢

热点阅读