数据可视化--实验四:地理数据可视化

2023-05-16

声明:本文CSDN作者原创投稿文章,未经许可禁止任何形式的转载,原文链接

文章目录

    • 概要
    • 实验过程
      • Pyecharts
      • 实验结果

概要

  • 学院:计算机科学与技术学院
  • 实验日期:2020-10-13
  • 实验目的: 掌握地理数据可视化工具方法
  • 实验内容:
    • 利用已有数据(CityData.xlsx)与已有工具,设计可视化方案,展示2020年全国新冠患者人数随时间的变化过程,并完成以下任务。
      • 统计截止4月1日各省的累计确诊数量,并通过图表展示。
      • 对每日各省的累计确诊患者数量进行统计,为图像添加时间轴,通过时间轴自动播放演示疫情发展的整个过程。
  • 注:表格文件在我的资源中免费下载。名为“数据可视化实验–表格附件”。链接 链接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, options

globals._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.month
            date[ws['B' + row].value]['day'] = ws['H' + row].value.day
        elif 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].value
        if 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].value
            else:
                data[ws['B' + row].value] = ws['D' + row].value
    datalist = []
    for k, v in data.items():
        datalist.append([k.strip("省").strip("市").strip("自治区").strip("壮族").strip("回族").strip("维吾尔"), v])
    return datalist


def 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)].value
        date.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日全国的累积确诊疫情地图,如下图

在这里插入图片描述

全国疫情地图时间轴如下图

数据可视化–实验四:地理数据可视化实验完成,两项实验结果均符合要求,实验成功。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据可视化--实验四:地理数据可视化 的相关文章

  • ROS主机搭建NFS服务器,虚拟机通过挂载访问及修改主机文件

    本文主要介绍在ROS主机中搭建NFS服务器 xff0c 虚拟机 xff08 从机 xff09 通过nfs挂载的方式访问及修改主机中文件的方法 一 ROS主机NFS服务器搭建 xff1a 若机器人配有显示屏 xff0c 此部分可直接在机器人上
  • ST-LINK V2.1 制作(含源码及其原理图)(type-c接口)可以配合robomaster 开发板下载口或者直接用杜邦线连接下载,支持串口调试

    标题ST LINK V2 1 制作 xff08 含源码及其原理图 xff09 xff08 type c接口 xff09 可以配合robomaster 开发板下载口或者直接用杜邦线连接下载 xff0c 支持串口调试 基于电子爱好者 xff0c
  • Java实现快速排序

    快速排序是在每一轮挑选一个基准元素 xff0c 比他大地站左边 xff0c 比他小的站右边 xff0c 从而把数列拆分成两部分 xff0c 假如元素是n个 xff0c 平均情况下需要logn轮 xff0c 因此平均实践复杂度是O nlogn
  • typora修改偏好设置不生效/无法修改偏好设置/偏好设置被重置的解决方法

    原因 之前bata版本过期 许多人都尝试修改电脑时间来继续使用 因此对 profile data这个文件的权限设置不正确 步骤 电脑勾选显示隐藏文件 C Users 电脑名 AppData Roaming Typora 选择时间排序 找到该
  • 单片机控制小车前进转弯

    1 小车前进 实现方法 xff1a 四个电机同时向前 xff08 小车后退同理 xff09 include lt AT89X51 H gt 定义小车驱动模块输入IO口 sbit IN1 61 P1 0 右1电机 高电平前进 sbit IN2
  • Java线上应用故障排查之一:高CPU占用

    一个应用占用CPU很高 xff0c 除了确实是计算密集型应用之外 xff0c 通常原因都是出现了死循环 xff08 友情提示 xff1a 本博文章欢迎转载 xff0c 但请注明出处 xff1a hankchen xff0c http www
  • 树莓派3B安装win11操作系统-成功版

    三个注意事项 事前准备永恒的决心成功 61 失败 事前准备 1 树莓派3B主板及电源连接 xff1b 2 HDMI的显示器 xff1b 3 USB的键盘鼠标 xff0c 或者有USB连接器的键盘鼠标 永恒的决心 1 其他安装过程 xff0c
  • 树莓派3B+安装Android 系统

    试水在树莓派3B 43 上安装Android 系统 xff08 完整的安卓 xff0c 非Adroid IOT xff0c 因为还不支持 xff09 xff0c 受到了一个小哥安装成功的鼓舞 xff08 带度盘资源 xff1a https
  • WinDbg 的入门经历

    WinDbg 的入门经历 WinDbg 是一款非常好用的调试工具 xff0c 针对于在win上的程序都有很好的调试效果 xff0c 相信玩逆向工程 Net 开发的同学都很熟悉 起因 在调试UCOS操作系统在windows上的仿真问题遇到的多
  • 目标检测网络中的 bottom-up 和 top-down理解

    看目标检测网络方面的论文时 xff0c 出现了一组对比词汇 xff1a bottom up和top down xff0c 查了一些资料 xff0c 结合个人理解 xff0c 得到的看法是 xff1a top down 顾名思义是自上而下进行
  • 2021.08.26学习内容 Win10+GeForce GTX1650安装NVIDIA显卡驱动及CUDA11.4+cuDNN8.2

    之前主要使用Ubuntu系统 xff0c 但是个人笔记本更多使用windows 为了方便跑一些pytorch的小代码 xff0c 所以想在windows配置一下相关环境 xff0c 达到调用GPU运算的目的 记录也是为了自己以后有安装需求少
  • vscode调试webpack-dev-server项目

    先上结果 vscode下载debugger for chrome 插件 创建launch json 添加的时候选择Chrome Launch会自动生成chrome调试模板 xff0c 主要是要加上 34 preLaunchTask 34 3
  • OpenNetworkLinux:i2c-gpio.c源码学习笔记

    OpenNetworkLinux xff1a i2c gpio c源码学习笔记 i2c gpio的init和exit i2c驱动需要首先在平台驱动上进行注册 xff0c 方可提供自身的总线供适配器进行注册 xff0c 注册流程类似于一个内核
  • 每天一个Lodash源码解析

    每天一个Lodash源码解析 chunk 方法介绍自我实现源码分析代码对比知识点补充浮点数转化为浮点数数组创建方法区别js中切割数组方法 slice 方法介绍自我实现源码分析代码对比知识点补充 96 96 gt gt gt 96 96 移位
  • conda的常用操作

    1 查看conda版本 2 更改安装第三方库的源 将国外的源改为清华镜像源 cmd窗口依次输入 xff1a conda config add channels https mirrors tuna tsinghua edu cn anaco
  • 云技术

    什么是 云 与云技术 xff1f 云技术是在分布式计算技术 网格计算基数基础上发展起来的一种计算技术 云技术基于资源虚拟化的方式 xff0c 为用户提供方便快捷的服务 xff0c 可以实现计算与存储的分布式与并行处理 云技术为其他信息技术
  • 什么是上转型对象及其基本特征

    5 12 什么是上转型对象及其基本特征 xff1f 上转型对象 子类对象赋值给父类变量 例如 xff1a package com wangxing test1 父类 public class Person public void testP
  • 【树莓派入门系列】4 树莓派安装测试torch与torchvision

    树莓派运行YOLOV5项目 安装测试torch amp torchvision 项目目录 点击跳转 0 首页 1 前期准备工作 2 配置树莓派系统 3 安装测试opencv 4 安装测试torch amp torchvision 5 测试y
  • javascript中in和includes的区别

    in的用法 遍历对象 span class token keyword let span names span class token operator 61 span span class token punctuation span n
  • centos安装java环境

    方式一 xff1a 安装java环境 1 先查看本地是否自带java环境 xff1a yum list installed grep java 2 卸载自带的java xff08 输入su xff0c 输入root超级管理员的密码 xff0

随机推荐