简单的针对CSVJSON两种格式的数据利用matplotlibpygal两个模块进行相关的数据可视化操作。绘制了温度变化图像和人口分布地图。


例子来自: 《Python编程从入门到实战》【美】Eric Matthes

CSV 文件

定义

逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。

导入数据并分析

import csv
from matplotlib import pyplot as pltfilename = 'weather_test.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)# 根据数据绘制图形
fig = plt.figure(dpi=128,figsize=(10,6))
plt.plot(highs,c='blue')# 设置图形的格式
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.savefig('highs_lows.png', bbox_inches='tight')
plt.show()

加载一组温度数据(CSV)。通过打印表头可知最高温度在第二列,提取数据,转换成整形,然后用过pyplot绘制相应的折线图。

结果

时间信息

datetime 模块

使用

from datetime import datetimemy_date = datetime.strptime('2017-10-1', '%Y-%m-%d')
print(my_date)

输出

2017-10-01 00:00:00

美化图表

导入全年的温度信息,提取最高温和最低温,然后绘制折线图。填充其间隔

import csv
from matplotlib import pyplot as plt
from datetime import datetimefilename = 'sitka_weather_2014.csv'
with open(filename) as f:reader = csv.reader(f)header_row = next(reader)dates,highs,lows = [],[],[]for row in reader:current_date = datetime.strptime(row[0],"%Y-%m-%d")dates.append(current_date)high = int (row[1])  # 转换为整形变量highs.append(high)      low = int(row[3])lows.append(low)# 根据数据绘制图形
fig = plt.figure(dpi=128,figsize=(10,6))
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)# 设置图形的格式
plt.title("Daily high and low 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.savefig('highs_lowswithdate.png', bbox_inches='tight')
plt.show()

结果

错误检测

如果导入的CSV文件中有错误,那么也许会导致程序崩溃,所以需要引入错误检测的相应功能。比如某一天的某些数据为空。

2014-2-15,82,60,37,20,17,14,39,21,9,30.05,29.97,29.91,10,10,10,23,7,28,0.00,0,,247
2014-2-16,,,,,,,,,,,,,,,,,,,0.00,,,-1
2014-2-18,75,56,37,25,21,16,51,25,13,30.08,30.01,29.93,10,10,10,9,3,,0.00,6,,157

在读取信息的过程中加入如下的代码:

for row in reader:try:current_date = datetime.strptime(row[0],"%Y-%m-%d")high = int (row[1])low = int(row[3])except ValueError:print(current_date, 'missing data')else:dates.append(current_date)highs.append(high)lows.append(low)

程序不会因为数据的缺失而卡死,可以继续往下执行。并且打印数据丢失的信息

2014-02-16 00:00:00 missing data

JSON 文件

JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

JSON文件内容

[{"Country Name": "Arab World","Country Code": "ARB","Year": "1960","Value": "96388069"},......{"Country Name": "Arab World","Country Code": "ARB","Year": "1961","Value": "98882541.4"},
]

这个文件实际上就是一个很长的Python列表,其中每个元素都是一个包含四个键的字典:国家名、国别码、年份以及表示人口数量的值。
为了提取2010年各国的人口数。编写如下代码

import json# 将数据加载到一个列表中
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']population = int(float(pop_dict['Value']))print(country_name + ": " + str(population))

应为每个国家的人数含有小数,直接有str转成int会报错,所以先转换成float,然后在转换成int型的变量。

输出结果

Chad: 11227000
Channel Islands: 153352
Chile: 17113688
China: 1338300000
Colombia: 46295000
Comoros: 735000

国别码

Pygal中的地图制作工具要求数据为特定的格式:用国别码表示国家,以及用数字表示人口数量。Pygal要求的是两位的国别码,但是原始数据包含的是三位。

Pygal使用的国别码存储在模块pygal_maps_world。字典COUNTRIES包含的键和值分别为两个字母的国别码和国家名。先通过命令pip install pygal_maps_world安装模块。

from pygal_maps_world.i18n import COUNTRIESfor country_code in sorted(COUNTRIES.keys()):print(country_code, COUNTRIES[country_code])

输出结果

ad Andorra
ae United Arab Emirates
af Afghanistan
al Albania
······

国别码转换

from pygal_maps_world.i18n import COUNTRIESdef get_country_code(country_name):"""根据指定的国家,返回Pygal使用的两个字母的国别码"""for code,name in COUNTRIES.items():if name == country_name:return code# 如果没有找指定的国家,就返回Nonereturn None

准备数据

# 打印每个国家2010年的人口数量
for pop_dict in pop_data: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:print(code + ":" + str(population))else:print('ERROR - ' + country_name)

输出结果

af:34385000
al:3205000
dz:35468000
ERROR - American Samoa
ad:84864
ao:19082000

制作世界地图

使用Pygal-Worldmap

通过一个简单的例子了解模块的使用

from pygal_maps_world.maps import World
wm = 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')

输出

绘制

import json
import pygalfrom pygal.style import LightColorizedStyle, RotateStyle  #修改整个图表的主题
from pygal_maps_world.maps import Worldfrom country_codes import get_country_code# 将数据加载到一个列表中
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 = pop_dict['Country Name']population = int(float(pop_dict['Value']))code = get_country_code(country)   if code:cc_populations[code] = population# 根据人口数量将所有国家分成三组
cc_pops_1,cc_pops_2,cc_pops_3 = {},{},{}
for cc,pop in cc_populations.items():if pop < 10000000:cc_pops_1[cc] = popelif pop < 1000000000:cc_pops_2[cc] = popelse:cc_pops_3[cc] = pop# 看看每组分别包含多少个国家
print(len(cc_pops_1), len(cc_pops_2), len(cc_pops_3))wm_style = RotateStyle('#336699', base_style=LightColorizedStyle)
wm = World(style=wm_style)
wm.title = 'World Population in 2010'
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')
  • cc_populations是一个dict,里面存放了两位国别码与人口的键值对。
  • world = World(style=wm_style)这是一个地图类。
  • wm_style = RotateStyle(‘#336699’,base_style=LightColorizedStyle)这里修改了pygal默认的主题颜色。

输出

python 数据可视化练习(2)相关推荐

  1. python数据可视化利用_利用pyecharts实现python数据可视化

    **python 利用pyecharts实现python数据可视化 **web pyecharts是一种交互式图表的表达方式. pyecharts是一款将python与echarts结合的强大的数据可 ...

  2. 《Python数据可视化编程实战》——5.5 用OpenGL制作动画

    本节书摘来异步社区<Python数据可视化编程实战>一书中的第5章,第5.5节,作者:[爱尔兰]Igor Milovanović,更多章节内容可以访问云栖社区"异步社区" ...

  3. 超硬核的 Python 数据可视化教程!

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:机器学习算法那些事 Python实现可视化的三个步骤: ...

  4. php数据库查询中文方块,解决Python数据可视化中文部分显示方块问题

    一.问题 代码如下,发现标题的中文显示的是方块 import matplotlib import matplotlib.pyplot as plt fig = plt.figure() ax = fi ...

  5. 超硬核的 Python 数据可视化教程

    来源:数据分析1480 本文约3000字,建议阅读6分钟 本文为你介绍Python实现可视化的三个步骤. Python实现可视化的三个步骤: 确定问题,选择图形 转换数据,应用函数 参数设置,一目了然 ...

  6. ​Python数据可视化工具怎么选?深度评测5款实用工具

    来源:早起Python 本文约3100字,建议阅读9分钟 本文通过真实绘图,为你深度测评Python五大数据可视化库. [ 导读 ]相信很多读者学习Python就是希望做出各种酷炫的可视化图表,当然你 ...

  7. Python数据可视化教程之基础篇

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 开运张 | 作者 知乎专栏 | 来源 https://zhuanlan.zhihu.c ...

  8. Python数据可视化——使用Matplotlib创建散点图

    Python数据可视化--使用Matplotlib创建散点图 2017-12-27 作者:淡水化合物 转载请注明网址:https://www.cnblogs.com/pengsky2016/p/812 ...

  9. 7步搞定Python数据可视化,业界大牛出品教程,Jupyter、Colab都有在线版

    郭一璞 发自 凹非寺  量子位 报道 | 公众号 QbitAI 做图表,谁不会?打开Excel,自动就可以生成各种各样的图表. 但你看这些图表呢? 结合真实地理数据,展现美国每个县的失业率. 全球自然 ...

  10. python 仪表盘-python数据可视化:pyecharts

    发现了一个做数据可视化非常好的库:pyecharts. 非常便捷好用,大力推荐!! 官方介绍:pyecharts 是一个用于生成 Echarts 图表的类库.Echarts 是百度开源的一个数据可视化 ...

最新文章

  1. Linux RAR 安装和使用
  2. 中关村论坛首次设置技术交易板块,人工智能和新一代信息技术专场发布会即将召开...
  3. [caffe]深度学习之图像分类模型VGG解读
  4. spring boot 开发 提交form表单出错
  5. 在DNN中如何使FriendlyURL使用PageName作为页面名称
  6. python 双向链表_数据结构-双向链表(Python实现)
  7. servlet容器_Servlet详解(一)之基本概念
  8. php后端mysql,【后端开发】PHP如何处理MySQL死连接
  9. 5 Django系列之通过list_display展示多对多与外键内容在admin-web界面下
  10. 老板总说你的报表没价值?这个动态报表神器,还有很多人不知道
  11. UE4 异步资源加载
  12. SQL Server中的登录触发器概述
  13. Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array(动态规划.递推)
  14. 前端日志输出分享(没有技术,纯娱乐)
  15. windows 组播收不到消息_只需2步,轻松解决登录微信电脑版后,手机收不到消息提醒的问题...
  16. WIFI-TTL透传模块
  17. 怎么用计算机来玩反恐精英,你第一次去网吧是为了玩什么游戏?网友:反恐精英一直到英雄联盟...
  18. 资本频频下注,为什么是江小白?
  19. js 跨域访问问题解决方法
  20. NOJ-1401 乘车费用 题解要点

热门文章

  1. 身份证实名校验接口,身份证二要素核验接口,身份证查询API接口【零存储,数据直连】
  2. java高并发解决方案_长文慎入-探索Java并发编程与高并发解决方案
  3. 读《5小时熟知金融常识》感
  4. 现代汽车和 IonQ 合作开发下一代电池; 研究人员提出量子电路快速复位技术 | 全球量子科技与工业快讯第五十二期
  5. ELLA:An Efficient Lifelong Learning Algorithm不完全记录
  6. iPadOS 更新日志 - 持续更新中
  7. 第一模块 商务邮件写作到底有多重要
  8. 论文浅尝 | Continual Learning for Named Entity Recognition
  9. gorm preload 搜索_8种最佳免费文件搜索工具
  10. 回归程序世界,努力做出成绩