pyecharts0.5.x制作含地图的数据看板

2023-10-27

引言

pyecharts作为Python的数据可视化包,其强大的功能不言而喻,Python + Echart,想想就觉得牛叉。目前pyecharts有两个大的版本,一个是0.5.x版本的,一个是1.0以后版本,而且这两个版本差别很大。如果是有的选,肯定优先选择1.0版本的,功能要比0.5.x版本的强大得多,而且支持链式调用。
但是肯定也有不少用不惯1.0及后续版本的同仁。博主因为之前一直用的是0.5.x版本的,如果要改成1.0版本的,很多项目都要大改,所以一直没有狠下心来换成1.0版本的包。
下面我介绍一下如何用pyecharts制作数据看板。
照样上编译环境:

  • Python3.7
  • 编译器Spyder或者pycharm都可以

另外,本文需要读者对pyecharts有一定的了解,不了解的可以去看看文档,文中有文档的链接,注意仔细看哦。

数据看板

数据看板意思就是,在一块大屏上显示多项数据图,比如地图,折线图,柱状图,漏斗图等等。
其实pyecharts0.5.x版本是支持数据看板功能的,请看pyecharts0.5.x版本的自定义图表接口,其中grid(并行显示多张图表)是最合适做数据看板的,但是开发人员说了:

用户可以自定义结合 Line/Bar/Kline/Scatter/EffectScatter/Pie/HeatMap/Boxplot 图表,将不同类型图表画在多张图上。第一个图需为 有 x/y 轴的图,即不能为 Pie,其他位置顺序任意。

也就是说,只能并行显示Line/Bar/Kline/Scatter/EffectScatter/Pie/HeatMap/Boxplot这几种图,如果要加入地图或者地理信息图,图表的位置就会乱,但是我现在又必须要在我的首页上加上地图,怎么办呢?博主一度无解。
先来看看1.0及后续版本的pyecharts是如何解决这个问题的。

代码请看这里,因为是官方的教程,大家直接去看就行了,我不再贴上来。原理就是用grid来添加各种基础图形,展示结果如下:
在这里插入图片描述
看起来还是很炫很震撼的,也就是博主要实现的功能
现在来介绍一下如何在低版本的pyecharts包里实现这个功能,主要是要把地图加进去。

0.5.x版本的pyecharts程序实现含地图的数据看板

导入包

from pyecharts import *
import os as os
from bs4 import BeautifulSoup
import pandas as pd
import datetime

可能已经有同学看出一些问题来了,导入了bs4,是不是要对网页进行编辑处理呢?

导入数据

我自己做了个excel数据,有3个sheet,其中的数据分别对应三个图,另外一个图,我要画仪表盘图,不需要数据。也就是说,我的数据看板上,有四张图。
首先,定义一个page图

page=Page()

对pyecharts有所了解的同学可能已经知道了,我这是想用page来生成数据看板,但是page图是翻页的,没法在一个页面上展示这么多图,继续看操作。

数据是自己随机生成的,命名为"数据.xlsx"。

f = pd.ExcelFile('数据.xlsx')
sheet = f.sheet_names

分别画出自己想要的四个图

如上面说的,我要在数据看板上画4个图,左上是地图,右上是一个折线图,左下是一个仪表板图,右下是个日历图

地图

直接上代码

d1 = pd.read_excel('数据.xlsx',sheet_name = sheet[0])
map_ = Map('地图数据', title_pos = 'center', title_top = '1%')
province = d1.iloc[:,0]
deaths = pd.Series.tolist(d1.iloc[:,1])
map_.add('', 
         province, deaths, 
         visual_range=[0, max(deaths)], 
         maptype='china', is_visualmap=True,
         visual_text_color='#000')
page.add_chart(map_, 'map')

画完map图后,记得把map图加到page中去哦(代码块最后一句)

折线图

d3 = pd.read_excel('数据.xlsx',sheet_name = sheet[1])
line = Line('数据1&数据2','', title_pos = 'center', title_top = '2%')
def request_date(x):
    return x[0:10]
index = d3.iloc[:,0].apply(str).apply(request_date)
series1 = pd.Series.tolist(d3.iloc[:, 1])
series2 = pd.Series.tolist(d3.iloc[:, 2])
line.add('数据1',index,series1,mark_point = ['max'],
         is_datazoom_show=True, xaxis_rotate=90)
line.add('数据2',index,series2,mark_point = ['max'],
         is_datazoom_show=True, xaxis_rotate=90,
         legend_pos = 'left',)
page.add_chart(line, name = 'line')

这里为啥要写个函数request_date,你可以自己试试不写的后果,excel读数据不像读csv数据,如果数据是时间格式的,那么用pandas读出来的数据自带时间格式,后面有时分秒,如果不处理一下,折线图一直出不来.

仪表盘图

gauge = Gauge('同期比例',title_pos = 'center', title_top = '1%')
gauge.add('','同比',67.3)
page.add_chart(gauge, 'gauge')

这个最简单,不解释

日历图

d4 = pd.read_excel('数据.xlsx',sheet_name = sheet[2])
begin = datetime.date(2020,1,1)
end = datetime.date(2020,3,31)
data = [
    [str(begin + datetime.timedelta(days=i)), d4.iloc[i,1]]
    for i in range((end - begin).days + 1)
]
heatmap = HeatMap("日历分布", "", title_pos = 'center', title_top = '2%')
heatmap.add(
    "",
    data,
    is_calendar_heatmap=True,
    visual_text_color="#000",
    visual_range_text=["", ""],
    visual_range=[0, max(d4['数据'])],
    calendar_cell_size=["auto", 30],
    is_visualmap=True,
    calendar_date_range=["2020-1-1",'2020-4-30'],
    visual_orient="horizontal",
    visual_pos="center",
    visual_top="80%",
    is_piecewise=True,
)
page.add_chart(heatmap, name = 'heatmap')

这个图有点复杂,有很多参数的设置需要去看文档,文档在这里
好了,画好4个图了,并且都添加到page里面去了,下面渲染成网页

page.render("page.html")

如果只是到这里,那就是文档中最简单的page图,需要从上往下翻页,而不是直观的展示是一个页面上,结果如下:
在这里插入图片描述
没达到目标是吧,别着急,bs4一直还没用呢

对html文件进行处理

不说废话,直接上代码

with open(os.path.join(os.path.abspath("."),"page.html"),'r+',encoding="utf8") as html:
    html_bf=BeautifulSoup(html,"lxml")
    divs=html_bf.find_all("div")
    divs[0]["style"]="width:750px;height:350px;position:absolute;top:70px;left:0px;border-style:solid;border-color:#FFFFFF;border-width:3px;"    #修改图表大小、位置、边框
    divs[1]["style"]="width:750px;height:350px;position:absolute;top:70px;left:750px;border-style:solid;border-color:#FFFFFF;border-width:3px;"  #修改图表大小、位置、边框
    divs[2]["style"]="width:750px;height:350px;position:absolute;top:420px;left:0px;border-style:solid;border-color:#FFFFFF;border-width:3px;"  #修改图表大小、位置、边框
    divs[3]["style"]="width:750px;height:350px;position:absolute;top:420px;left:750px;border-style:solid;border-color:#FFFFFF;border-width:3px;"  #修改图表大小、位置、边框
    body=html_bf.find("body")
    #body["style"]="background-color:#333333;"
    div_title="<div align=\"center\" style=\"width:1500px;\">\n<span style=\"font-size:32px;font face=\'黑体\';color:#000000\"><b>第一季度总体情况</b></div>"    #修改页面背景色、追加标题
    body.insert(0,BeautifulSoup(div_title,"lxml").div)
    html_new=str(html_bf)
    html.seek(0,0)
    html.truncate()
    html.write(html_new)
    html.close()

再看结果:
在这里插入图片描述
这就对了
今天没空了,后面有时间,我在仔细解释beautifulsoup是如何来对网页进行修改的。

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

pyecharts0.5.x制作含地图的数据看板 的相关文章

随机推荐

  • 技能树-网络爬虫-selenium

    文章目录 前言 一 selenium 二 selenium 测试用例 总结 前言 大家好 我是空空star 本篇给大家分享一下 技能树 网络爬虫 selenium 一 selenium Selenium是web自动化测试工具集 爬虫可以利用
  • Unity_获取当前点击物体的名字(获取名字

    获取当前点击物体的名字 返回一个string类型的值 EventSystem current currentSelectedGameObject name
  • Ant Design Blazor 发布 0.13.0,正式支持.NET 7!

    时隔3个月 Ant Design Blazor 发布新功能版本 0 13 0 并正式支持 NET 7 大家快去访问 antblazor com 体验吧 新增 NET 7 目标框架支持 2810 ElderJames 重构 Mentions
  • 问题:USART无法进入接收中断

    原因1 时钟TIM的超时配置不正确 时间太短 解决1 将时钟TIM超时时间加长 原因2 接收中断未使能 解决2 将接收中断ENABLE
  • Vue-移动端rem适配

    1 rem 使用 rem 单位可以让设计更加灵活 能够控制元素整体放大缩小 而不是固定大小 rem单位基于 html 元素字体大小 2 适配工具 lib flexible postcss px2rem exclude 3 lib flexi
  • Google Play 上架总结(二)Google账户关联详解

    近期 本人在 App 上架Google Play 过程中 频繁遇到账号被关联封禁 在踩过很多坑后 我觉得有必要总结一下 给其它朋友作为参考 一 Google 账户关联是指什么 账户关联是就是当Google开发者账号因为各种原因被封停了 此时
  • Java制作报表系统流程_finereport报表制作详细过程

    一般来说 一个完整的报表设计流程 大体分为如下几个步骤 1 打开设计器 2 配置数据源 3 新建报表 4 配置私有数据源 5 报表设计 6 预览报表 7 发布报表 第一部分 配置数据源 打开报表设计器 在设计器最上方的菜单栏当中 选择服务器
  • Redis时单线程设计的,为什么还这么快

    单线程设计的考虑 Redis采用单线程好处在于避免了多线程对数据竞争的问题 加锁的问题 上下文切换的问题 据官方解释 redis的瓶颈不在cpu 而在内存或者网络的带宽 综合考虑然后就采用了单线程 Redis的性能非常高 每秒可以承受10W
  • a-cascader编辑绑定值数据变化,但页面dom不回显不更新问题($set用法)

    问题 编辑时 级联组件绑定数据变化 的dom不进行更新 原因 引用值类型 对象或数组 动态添加或删除某一个属性值 需要使用this set 或者 Object assign 不然数据触发不到getter和setter 对from直接赋值不会
  • Golang知识点五、数据类型

    数据类型 从本篇文章开始 记录Golang数据类型相关的内容 数据类型相关的知识点包括slice map string三个部分 1 切片 1 1 从数组说起 数组是具有固定长度具有零个或者多个相同数据类型元素的序列 由于数组长度固定 在Go
  • 家庭IOT监测之摄像头OV7670测试

    本篇目标 使用STM32F407驱动摄像头OV7670 并上位机显示照片结果 材料准备 STM32F4标准工程 stm32f407自建标准工程 stm32f4标准工程 git仓库地址 STM32F4摄像头测试工程 里面包含ov7670驱动文
  • C++与C#相比,哪个更适合开发大型游戏?

    我觉得这个问题倒过来回答比较合适 先解答一下目前主流的大型游戏 都是使用什么语言开发的 再说说哪种语言更适合开发大型游戏 首先 先说下 大部分游戏 甚至是应用 都极少只使用一种语言开发的 主流游戏的开发语言 LOL LOL登陆后的界面 是使
  • openwrt上如何进行串口加密

    实际生产的固件许多都对串口做了加密 这样就增加了别人觊觎你的生产固件的难度 毕竟没有几个厂商不忌惮对手对其固件内容的分析 当然这种串口加密并不能起到特别大的阻碍作用 因为只要别人想看你的固件 你是很难防住的 但串口加密至少会挡住以少部分人
  • C++ 虚函数

    如何在派生类中回避虚函数 借助于作用域运算符实现 int p derived gt base func 强行调用基类中定义的函数版本 而不管derived的动态类型到底是什么 通常当一个派生类的虚函数调用它覆盖的基类的虚函数版本时 基类版本
  • @Validated 返回参数太乱处理

    对 Validated 返回参数太乱 处理为只关注重点信息 1 处理前 有参数 通过接口校验时返回如下长串 2 处理后 处理代码 RestControllerAdvice Slf4j public class SysExceptionHan
  • 1001 害死人不偿命的(3n+1)猜想 (15 分)

    卡拉兹 Callatz 猜想 对任何一个正整数 n 如果它是偶数 那么把它砍掉一半 如果它是奇数 那么把 3n 1 砍掉一半 这样一直反复砍下去 最后一定在某一步得到 n 1 卡拉兹在 1950 年的世界数学家大会上公布了这个猜想 传说当时
  • Windows环境下安装PyMySQL(已安装Anaconda)

    我的Anaconda安装目录为D Anaconda3 在cmd中执行 会出现 随后输入pip 会出现等 随后输入
  • “真正的机会”:ChatGPT 如何帮助大学申请者

    随着平权行动的结束 生成式人工智能可以为没有导师或辅导员的学生提供帮助 从而实现招生 民主化 关于人工智能的争论主要分为三个基本类别 焦虑的不确定性 它会夺走我们的工作吗 存在的恐惧 它会杀死我们所有人吗 和简单的实用主义 人工智能可以写我
  • C语言实现Unix时间戳和北京时间的相互转换(已编译,亲试可用~)

    目录 一 什么是Unix时间戳 二 应用C语言库函数 三 C语言实现Unix时间戳与北京时间的相互转换 一 什么是Unix时间戳 1 Unix时间戳是从1970年1月1日 UTC GMT的午夜 开始所经过的秒数 不考虑闰秒 2 Unix时间
  • pyecharts0.5.x制作含地图的数据看板

    引言 pyecharts作为Python的数据可视化包 其强大的功能不言而喻 Python Echart 想想就觉得牛叉 目前pyecharts有两个大的版本 一个是0 5 x版本的 一个是1 0以后版本 而且这两个版本差别很大 如果是有的