制作世界人口地图json--10.4学习日记

大家好!这里是记录一个非专业的小白学习python的路径,完全是零基础自学。由于作者刚刚大学毕业所学专业找到的工作不太喜欢,工作空闲时间长,在职学习python语言,想借助这个平台记录一下自己学习的路径,文章有什么错误也希望大佬们积极指出,万分感谢!希望同大家一起学习,一起进步,谢谢。内容基于书籍python编程:从入门到实践    作者:Eric Matthes [美]

一、复习昨日之学习

使用csv文件绘制气温图表,引进csv库使用matplotlib来绘制最高气温最低气温两条线更直观的观察温度区间变化。想要详细学习的铁子们可以关注作者并翻阅昨天学习日记

昨日知识点练习题:16-2

16-2 比较锡特卡和死亡谷的气温:在有关锡特卡和死亡谷的图表中,气温刻度反 映了数据范围的不同。为准确地比较锡特卡和死亡谷的气温范围,需要在 y 轴上使用相 同的刻度。为此,请修改图 16-5 和图 16-6 所示图表的 y 轴设置,对锡特卡和死亡谷的 气温范围进行直接比较(你也可以对任何两个地方的气温范围进行比较)。你还可以尝 试在一个图表中呈现这两个数据集。

分析:要将y轴使用相同的刻度,可使用matplotlib库中的plot函数,使用ylim()来设置。plot()函数的使用详情可以关注作者翻看作者9.30号学习日记有详细介绍plot()函数的使用。

效果图:

源代码:

#coding=gbk

#16-2
#highs_lows.py
import csv #引入库
from matplotlib import pyplot as plt 
from datetime import datetime #引进datetime库


#从文件中获取日期、最高气温和最低气温
def get_weather_data(filename,dates,highs,lows,high_index,low_index):
	
	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)#得到日期和最高气温的索引为2和5,6为最低气温
	
	
		
		for row in reader:
			try:#避免数据有误
				current_date = datetime.strptime(row[2],'%Y-%m-%d')#将日期字符串转变为数字
				dates.append(current_date)
				high = int(row[high_index])#将获取的字符串变为整数(数字化)
				highs.append(high)
			except ValueError:
				print(current_date,'missing date')
			
			else:
				low = int(row[low_index])
				lows.append(low)
		print(highs,lows)



#获取锡特卡的气温图像
filename='sitka_weather_2018_simple.csv'
dates,highs,lows = [],[],[]			
get_weather_data(filename,dates,highs,lows,5,6)
fig,ax = plt.subplots()
#figure(dpi=128,figsize=(10,6))
ax.plot(dates,highs,c='red',alpha=0.5)#指定颜色透明度为0.5
ax.plot(dates,lows,c='blue',alpha=0.5)
plt.fill_between(dates,highs,lows,facecolor='blue',alpha=0.1)#调用函数将最高温度与最低温度之间填充

#获取死亡谷的气温图像
filename='death_valley_2018_simple.csv'
dates,highs,lows = [],[],[]			
get_weather_data(filename,dates,highs,lows,4,5)
ax.plot(dates,highs,c='red',alpha=0.2)# 指定颜色透明度为0.5
ax.plot(dates,lows,c='blue',alpha=0.2)
plt.fill_between(dates,highs,lows,facecolor='red',alpha=0.1)#调用函数将最高温度与最低温度之间填充


#设置图形格式
plt.title("Daily high and temperatures temperatures, 2018",fontsize=24)
plt.xlabel("",fontsize=16)
fig.autofmt_xdate()#绘制斜的日期标签,避免重叠
plt.ylabel("Temperature(F)",fontsize=16)
plt.ylim(10,130)
plt.tick_params(axis='both',which='major',labelsize=16)

plt.show()

 在编写此段代码时需要注意的地方有,文件路径得写完整,除非将你所需要的文件复制到程序所在的同一文件夹下后文件路径就是文件名了。获取如时间,最高温度,最低温度的索引时可以使用作者上面的代码,也可以使用excel或wps的表格处理,这样做的方式就是既能知道需要的索引还能检查数据的完整性,由于作者下载的本书配套文件,在死亡峡谷文件中中间有一天的数据缺失导致程序不能正常运行。


二、今日新学习

制作世界人口地图,json格式

今天学习的和昨天的有点相似,首先还是提取相关数据,将字符串数字化为制图做准备。这其中还是用了一些标准库使国家名称变为2个字的国际化标准,使地图交互式即当鼠标移动到某一个国家时,显示这个国家的人口。根据人口突出地图的颜色,打印时可能比较暗,可以使用标准库来加亮主题颜色。

效果图:

源代码:

#coding=gbk

#world_population.py

import pygal
import json
import pygal_maps_world.maps
from pygal_maps_world.i18n import COUNTRIES
from pygal.style import RotateStyle #调整颜色
from pygal.style import LightColorizedStyle #加亮颜色主题


for country_code in sorted(COUNTRIES.keys()):
	print(country_code,COUNTRIES[country_code])


def get_country_code(country_name):
	#根据指定的国家,返回pygal 使用的两个字母的国别名
	for code ,name in COUNTRIES.items():
		if name == country_name:
			return code
	#如果没找到指定的国家就返回None
	return None

#将数据加载到一个列表中
filename = 'population_data.json'
with open(filename)as f:
	pop_data = json.load(f)


#创建一个包含人口数量的字典
cc_populations = {}
	
#打印每个国家2010年人口数量
for pop_dict in pop_data:#遍历整个列表找到2010年
	if pop_dict['Year']== '2010':
		country_name = pop_dict['Country Name']
		population =int (float(pop_dict['Value']))#将字符串转换成数字值
		code = get_country_code (country_name)
		if code:
			cc_populations[code] = population
			print(code+":"+str(population))#使用国际标准化两个字母来表示国家
		else:
			print("error-"+country_name)

#根据人口数量将所有的国家分成三组
c_pop_1,c_pop_2,c_pop_3={},{},{}
for c,pop in cc_populations.items():
	if pop<10000000:
		c_pop_1[c] = pop
	elif pop<1000000000:
		c_pop_2[c] = pop
	else: 
		c_pop_3[c] = pop			

#看看每组分别包含多少个国家
print(len(c_pop_1),len(c_pop_2),len(c_pop_3))

			
#制作世界地图
#maps.py

wm_style=LightColorizedStyle
wm= pygal_maps_world.maps.World(style=wm_style)#创建实例,这个类是pygal本身就有的不需要我们自己编写
wm.title = 'World Population in 2010,by Country'
wm.add('0-10m',c_pop_1)
wm.add('10m-1bn',c_pop_2)
wm.add('>10bn',c_pop_3)

wm.render_to_file('maps.svg')#保存在同一文件夹下,以svg文件格式保存

在上面代码中使国家名称变为2个字母时按书上的输入的话可能会出现问题,因为pygal好像是已经删除i18n板块。解决方法:

解决方法:终端运行

pip install pygal_maps_world
(注意 pip 和 pip3 的区别)

在程序开头使用from pygal_maps_world.i18n import COUNTRIES后续world_population.py文件中调用
wm = pygal.Worldmap()
依旧会报错AttributeError: module 'pygal' has no attribute 'Worldmap',解决方式
import pygal_maps_world.maps
wm = pygal_maps_world.maps.World()
 

如果想了解更多知识点请关注作者,并多多点赞支持,您的观看点赞是对我最大回礼,最大的动力,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值