数据可视化--实验四:地理数据可视化
声明:本文CSDN作者原创投稿文章,未经许可禁止任何形式的转载,原文链接
文章目录
- 概要
- 实验过程
- Pyecharts
- 实验结果
概要
- 学院:计算机科学与技术学院
- 实验日期:2020-10-13
- 实验目的: 掌握地理数据可视化工具方法
- 实验内容:
- 利用已有数据(CityData.xlsx)与已有工具,设计可视化方案,展示2020年全国新冠患者人数随时间的变化过程,并完成以下任务。
- 统计截止4月1日各省的累计确诊数量,并通过图表展示。
- 对每日各省的累计确诊患者数量进行统计,为图像添加时间轴,通过时间轴自动播放演示疫情发展的整个过程。
- 利用已有数据(CityData.xlsx)与已有工具,设计可视化方案,展示2020年全国新冠患者人数随时间的变化过程,并完成以下任务。
- 注:表格文件在我的资源中免费下载。名为“数据可视化实验–表格附件”。链接 链接2
实验过程
本次实验选择编程类工具Pyecharts。
Pyecharts
在Pycharm中新建python项目,并引入pyecharts,openpyxl,datetime等必要包。
创建main.py,写入以下内容。
#!/usr/bin/env python
# coding:utf-8
"""
Name : main.py
Author : F
Time : 2020/10/14 08:42
Desc : 数据可视化实验四
"""
import time
import datetime
import openpyxl
from pyecharts.charts import Map, Timeline, Bar
from pyecharts import globals, optionsglobals._WarningControl.ShowWarning = False # 关闭pyecharts给出的警告filename = "CityData.xlsx"
ws = openpyxl.load_workbook(filename)['CityData']# 两天相减,拿到相差的天数
def subdays(date1: time, date2: time):return (datetime.datetime(date1[0], date1[1], date1[2]) - datetime.datetime(date2[0], date2[1], date2[2])).days# 通过某运算法则选出a,b其中一个,选a返回True,选b返回False
# a b return
# 正 正 min
# 正 非正 False
# 非正 正 True
# 非正 非正 max
def getMostLeftNear(a, b):if (a > 0 and b > 0) or (a <= 0 and b <= 0):return abs(a) < abs(b)elif (a > 0 and b <= 0) or (a <= 0 and b > 0):return b > 0# 认为截止至某天的24时,获取到截止到此刻的省市直辖市自治区的累计确诊人数。我已经不想看这段代码了,建议不看。
def confirmedAt(dateTime: time):data, date = {}, {}for i in range(2, ws.max_row):# 如果已经有这个省的日期了row = str(i + 1)if date.__contains__(ws['B' + row].value):dirdate_april1 = subdays(time.strptime("2020-" + str(date[ws['B' + row].value]['month']) + "-" + str(date[ws['B' + row].value]['day']),"%Y-%m-%d"), dateTime)wsdate_april1 = subdays(time.strptime("2020-" + str(ws['H' + row].value.month) + "-" + str(ws['H' + row].value.day),"%Y-%m-%d"), dateTime)if date.__contains__(ws['B' + row].value) and getMostLeftNear(wsdate_april1, dirdate_april1):date[ws['B' + row].value]['month'] = ws['H' + row].value.monthdate[ws['B' + row].value]['day'] = ws['H' + row].value.dayelif not date.__contains__(ws['B' + row].value):date[ws['B' + row].value] = {'month': ws['H' + row].value.month, 'day': ws['H' + row].value.day}for i in range(2, ws.max_row):row = str(i + 1)wsdate = ws['H' + row].valueif wsdate.month == date[ws['B' + row].value]['month'] and wsdate.day == date[ws['B' + row].value]['day']:if data.__contains__(ws['B' + row].value):data[ws['B' + row].value] += ws['D' + row].valueelse:data[ws['B' + row].value] = ws['D' + row].valuedatalist = []for k, v in data.items():datalist.append([k.strip("省").strip("市").strip("自治区").strip("壮族").strip("回族").strip("维吾尔"), v])return datalistdef drawConfirmedMapAt(dateTime: time):map = Map()map.set_global_opts(title_opts=options.TitleOpts(title=str(dateTime[1]) + '月' + str(dateTime[2]) + "日24时全国疫情确诊地图"),visualmap_opts=options.VisualMapOpts(max_=3600, is_piecewise=True,pieces=[{"max": 1999999, "min": 10000, "label": "10000人及以上","color": "#8A0808"},{"max": 9999, "min": 1000, "label": "1000-9999人", "color": "#B40404"},{"max": 999, "min": 500, "label": "500-999人", "color": "#DF0101"},{"max": 499, "min": 100, "label": "100-499人", "color": "#F78181"},{"max": 99, "min": 10, "label": "10-99人", "color": "#F5A9A9"},{"max": 9, "min": 0, "label": "1-9人", "color": "#FFFFCC"},], ) # 最大数据范围,分段)map.add("截止" + str(dateTime[1]) + '月' + str(dateTime[2]) + "日24时确诊数量", data_pair=confirmedAt(dateTime),maptype="china", is_roam=True)map.render(str(dateTime[1]) + '月' + str(dateTime[2]) + "日24时全国疫情确诊地图.html")def getAllDate():date = set()for i in range(2, ws.max_row):curdate = ws['H' + str(i + 1)].valuedate.add(time.strptime(str(curdate.year) + '-' + str(curdate.month) + '-' + str(curdate.day), "%Y-%m-%d"))date = list(date)date.sort()return date# 画出所有时间的疫情累计确诊地图
# 因为函数confirmedAt(dateTime: time)的时间复杂度高达O(n),所以本函数时间复杂度高达O(n^2),肉眼可见他很慢
def drawAllConfirmedMap():tl = Timeline()date = getAllDate()for curdate in date:map = (Map().add("截止" + str(curdate[1]) + '月' + str(curdate[2]) + "日24时确诊数量", data_pair=confirmedAt(curdate),maptype="china", is_roam=True).set_global_opts(title_opts=options.TitleOpts(title=str(curdate[1]) + '月' + str(curdate[2]) + "日24时全国疫情确诊地图"),visualmap_opts=options.VisualMapOpts(max_=3600, is_piecewise=True,pieces=[{"max": 1999999, "min": 10000, "label": "10000人及以上","color": "#8A0808"},{"max": 9999, "min": 1000, "label": "1000-9999人","color": "#B40404"},{"max": 999, "min": 500, "label": "500-999人","color": "#DF0101"},{"max": 499, "min": 100, "label": "100-499人","color": "#F78181"},{"max": 99, "min": 10, "label": "10-99人", "color": "#F5A9A9"},{"max": 9, "min": 0, "label": "1-9人", "color": "#FFFFCC"},], ) # 最大数据范围,分段))tl.add(map, str(curdate[1]) + '月' + str(curdate[2]) + "日")print(str(curdate[1]) + '月' + str(curdate[2]) + "日完成")tl.render("全国疫情确诊地图.html")def drawConfirmedBarAt(dateTime: time):data = confirmedAt(dateTime)title = str(dateTime[1]) + '月' + str(dateTime[2]) + "日24时全国累计确诊"province, confirmed = [], []for curdata in data:province.append(curdata[0])confirmed.append(curdata[1])bar = Bar()bar.add_xaxis(province).add_yaxis(title, confirmed).set_global_opts(title_opts=options.TitleOpts(title="Bar-基本示例", subtitle="我是副标题"),xaxis_opts=options.AxisOpts(axislabel_opts=options.LabelOpts(rotate=-45)),).render(title + ".html")print(title)drawConfirmedBarAt(time.strptime("2020-04-01", "%Y-%m-%d"))
# drawConfirmedMapAt(time.strptime("2020-04-01", "%Y-%m-%d")) # 画出4月1号的疫情地图
drawAllConfirmedMap() # 画出所有时间的疫情地图
代码流程:
+ 读取Excel文件
+ 拿到数据中每个省份截止到4月1号前的最新日期,因为数据中有些省份缺失4月1日的数据
+ 拿到每个省份截止到4月1号前的最新日期的确诊数量
+ 画出确诊数量的柱状图,也可以画出疫情地图,这样也就完成了任务一“截止4月1日各省的累计确诊数量”。
+ 拿到每个省份每天的确诊数量
+ 使用时间轴和Map画出整个时间的疫情地图,并且可以自动播放,这样也就完成了任务二“对每日各省的累计确诊患者数量进行统计,为图像添加时间轴,通过时间轴自动播放演示疫情发展的整个过程”。
实验结果
运行上述代码,画出4月1日全国的累积确诊柱状图和疫情地图,如下图
上图为4月1日全国的累积确诊柱状图,同样也可以画出4月1日全国的累积确诊疫情地图,如下图
全国疫情地图时间轴如下图
数据可视化–实验四:地理数据可视化实验完成,两项实验结果均符合要求,实验成功。
数据可视化--实验四:地理数据可视化相关推荐
- 数据可视化实验:python数据可视化-柱状图,条形图,直方图,饼图,棒图,散点图,气泡图,雷达图,箱线图,折线图
数据可视化实验:python数据可视化 实验8-12:大数据可视化工具-python 目录 1柱状图 2条形图 3直方图 4饼图 5棒图 6散点图 7气泡图 8雷达图 9箱线图 10折线图 1柱状图 ...
- 数据库原理与应用实验指导书 实验四:数据查询
数据库原理与应用 实验指导书 实验四:数据查询 一.实验目的 掌握SELECT语句的基本语法: 熟练掌握模糊查询的用法: 熟练掌握连接查询的用法: 熟练掌握子查询的用法. 二.实验内容 表数据的查询 ...
- MongoDB 数据操作(四)数据删除
来源:我的博客站 OceanicKang |<MongoDB 数据操作(四)数据删除> 上一篇:<MongoDB 数据操作(三)数据更新(2)修改器> 在 MongoDB 中删 ...
- 数据治理系列(四):数据质量管理
一.什么是数据质量管理? 数据质量管理是指对数据从产生.获取.存储.共享.维护.应用等各个阶段可能引发的各类数据质量问题,进行识别.度量.监控.预警等一系列管理活动,并通过改善和提高组织的管理水平使数 ...
- 数据可视化|实验四 分析1996-2015年人口数据特征间的关系
使用 NumPy 库读取人口数据 使用 numpy 库读取人口数据,分析 1996~2015 年人口数据特征间的关系: %matplotlib inlineimport numpy as npimpo ...
- 【matlab】实验四:数据可视化+matlab绘图
题目一 1.设y=cos(x)(0.5+3sin(x)/(1+x^2)),把x=0~2*pi间分为101点,绘制图像 clear;clc; x=0:2*pi/100:3*pi; y=cos(x)*(0 ...
- Python数据可视化:Cartopy 地理空间数据可视化
前言 Cartopy 是为了向 Python 添加地图制图功能而开发的扩展库.该项目致力于以 matplotlib 包为基础,用简单直观的方式操作各类地理要素的成图.Cartopy 官网的画廊页面已经 ...
- 数据库实验四:数据高级查询
真给我整无语了,数据库实验怎么这么多,要考试还要写实验.写写写,写他娘的什么东西. 实验内容 实现查询 ps:实验要求用两种方法写的我除了union都是用的两种方法写,union查了好久都查不到,或许 ...
- 转:实验3 地理空间数据可视化
链接:https://blog.csdn.net/wpxu08/article/details/78130185
- Python新型冠状病毒疫情数据自动爬取+统计+发送报告+数据屏幕(四)数据屏幕
今天介绍给大家的是:如果使用 Python 制作数据屏幕,将从最基础的开始,如果熟悉 django 和 Python 的朋友可直接跳过 项目功能设计: 定时爬取疫情数据存入Mysql(爬虫篇) 进行数 ...
最新文章
- 【转】【iOS知识学习】_视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途...
- openresty开发系列34--openresty执行流程之4访问阶段
- 动态规划之数字三角形模型
- ActiveMQ(一)简介与架构
- SQL自动流水号函数
- 网站是如何跟踪监视你的
- 【MFC】多线程同步—事件
- Ajax技术(WEB无刷新提交数据)
- Java入门基础 安装并配置Java软件和JDK
- 使用Python实现excel项目清单自动生成word文档
- xjoi 1524 枚举集合
- 微信指纹支付原理浅析
- 收藏!这37个自学网站,一年让你省下十几万
- @Transactional注解解析
- SQL SERVER中PERCENTILE_CONT和PERCENTILE_DISC
- 大数据【企业级360°全方位用户画像】业务数据调研及ETL
- 【散文】 岁月留痕遇好友
- FDC2214调试笔记(1)——为什么FDC2214输出的会是0x00000000或者0xffffffff?
- dbcp连接池不合理的锁导致连接耗尽
- Android 使用ADB命令启动浏览器并访问指定的URL
热门文章
- html动态生成tr标签,JS动态添加tr元素
- Gossip协议笔记--谣言、流行病协议
- 用连续自然数之和来表达整数
- Java ques: Unknown initial character set index ‘255‘ received from server. Initial client character
- android 连续播放动画,Android ObjectAnimator 无限循环播放,实现上下左右浮动效果...
- 如何使用PM2 部署 nodejs 项目
- java编译找不到符号_java编译时找不到符号,怎么处理
- Idea编译:Java找不到符号
- 左手云通讯,右手AI,容联为何能成为云联络中心“风向标”?
- 【每日学习3.31】 筹备腾讯三面 - 阿V