23/04/16使用pyecharts绘制中国地图并显示城市

需求

近日几个高中朋友都上岸研究生,某人提议做一个求学路线图,这种技术活儿当然就交给我了。

  • 一共是两幅图,本科城市分布图和研究生城市分布图
  • 背景是中国地图
  • 在地图中标记大学所在城市
  • 在标记点上显示每个人的头像
  • 附录显示大学名称
  • 每个人本科和研究生之间添加一条线
  • 导出为图片

环境

python 3.11.2
pyecharts 2.0.3
selenium 4.8.3
pyecharts-snapshot 0.2.0

pyecharts

官方文档
是一个基于Echarts的python工具包,用于数据可视化,可以用来画日历图、饼图、雷达图、词云图、涟漪特效图、热力图、散点图、数图、地图、3D图等

安装pyecharts

pip install pyecharts

pyecharts-snapshot

将 pyecharts/echarts.js 的输出呈现为 png、jpeg、gif、eps、svg 图像、原始 base64 编码或 pdf 文件

安装pyecharts-snapshot

pip install pyecharts-snapshot

使用

pyecharts-snapshot用来将地图渲染成图片。
要使用pyecharts-snapshot,确保电脑正确安装Phantomjs,否则会报错,Phantomjs官网下载链接,选择符合自己电脑的版本下载。
下载完成之后,将bin加入到系统变量中。

开始绘图

使用pyecharts的过程,会学到链式调用和万物皆可对象化!

一、初始化画布

第一步,我们要画中国地图,创建一个Geo对象(地理图标)

geo = Geo()

Geo()中初始化地图,设置一些基本的参数
一般写法

geo = Geo(width="1000px",height="600px",theme=ThemeType.ESSOS,  # 地图主题)

但是在pyecharts中有一个重要的思想就是
在这里插入图片描述
标准的写法是

geo = Geo(init_opts=opts.InitOpts(width="1000px", # 画布宽度height="600px", # 画布高度theme=ThemeType.ESSOS,  # 地图主题))

在这里使用init_opts进行初始化,init_opts是一个options,值由opts.InitOpts实例化得到,而width="1000px"...params则作为opts.InitOpts的参数。

个人认为万物皆options有以下几点好处:

  • 统一化:所有的图标对象都可以使用同一个参数
  • 方便查阅文档:需要哪个options就在文档中查找哪个,很直观。

比如这个InitOpts,经查阅文档后共有这么多属性

class InitOpts(# 图表画布宽度,css 长度单位。width: str = "900px",# 图表画布高度,css 长度单位。height: str = "500px",# 图表 ID,图表唯一标识,用于在多图表时区分。chart_id: Optional[str] = None,# 渲染风格,可选 "canvas", "svg"# # 参考 `全局变量` 章节renderer: str = RenderType.CANVAS,# 网页标题page_title: str = "Awesome-pyecharts",# 图表主题theme: str = "white",# 图表背景颜色bg_color: Optional[str] = None,# 远程 js host,如不设置默认为 https://assets.pyecharts.org/assets/"# 参考 `全局变量` 章节js_host: str = "",# 画图动画初始化配置,参考 `global_options.AnimationOpts`animation_opts: Union[AnimationOpts, dict] = AnimationOpts(),
)

再加上一些必要的参数,完整版初始化代码如下:

geo = Geo(init_opts=opts.InitOpts(width="1000px", # 画布宽度height="600px", # 画布高度theme=ThemeType.ESSOS,  # 地图主题),is_ignore_nonexistent_coord=True)

二、设置地图类型

调用.add_schema()方法设置Geo对象的地图类型、缩放、视角中心点等

    .add_schema(maptype='china' # 设置地图类型为chinazoom=1.5, # 缩放比例为1.5center=[105.95, 34.27], # 设置视角中心点为[105.95, 34.27])

其中zoom center都是为后面导出图像设置的,效果如下
zoom为1.5
zoom为1

zoom=1,center向左偏离

三、添加点

调用geo对象的.add方法,添加需要显示的点,并设置其样式

这里最坑的是,文档中没有给出点实例,导致调试data废了很大功夫
文档描述
以北京举例:应该是("北京“, [116.407526, 39.90403]),数据项为元组类型,第一个元素为坐标点名称,第二个元素为坐标点的经度纬度,如果多个点,则data_pair为列表形式

这里有个坑,名称和经纬度必须一一对应才能正确显示,如果把北京改成北京市区,就不行了,估摸着他应该内置了一个对应关系

.add(series_name='研究生', # 这一系列点的名称symbol_size=18, # 标志(圆圈)的尺寸data_pair=city_graduate, # 数据项type_="scatter", # 数据类型 label_opts=opts.LabelOpts( #标签(就是文字)is_show=True, # 是否显示标签formatter='{b}', # 标签显示的格式font_size=20, # 标签的文字大小font_style="normal", # 标签的样式))

四、渲染HTML

调用geo.render参数为渲染后的html文件路径

.render('html/graduate.html')

五、渲染图片

第一个参数为渲染引擎,这里选择phantomjs;第二个参数是html文件路径;第三个参数是渲染后的图片文件路径

from snapshot_phantomjs import snapshot
from generate_coordinate import generate_coordinatemake_snapshot(snapshot, 'html/graduate.html', 'image/graduate.png')

六、整合

这里不得不提python的链式调用,十分直观,简约

geo = (Geo(init_opts=opts.InitOpts(width="1000px", # 画布宽度height="600px", # 画布高度theme=ThemeType.ESSOS,  # 地图主题),is_ignore_nonexistent_coord=True).add_schema(maptype='china' # 设置地图类型为chinazoom=1.5, # 缩放比例为1.5center=[105.95, 34.27], # 设置视角中心点为[105.95, 34.27]).add(series_name='研究生', # 这一系列点的名称symbol_size=18, # 标志(圆圈)的尺寸data_pair=city_graduate, # 数据项type_="scatter", # 数据类型 label_opts=opts.LabelOpts( #标签(就是文字)is_show=True, # 是否显示标签formatter='{b}', # 标签显示的格式font_size=20, # 标签的文字大小font_style="normal", # 标签的样式)).render('html/graduate.html'))

把所有有关这个对象的操作链成一个链条执行,将每个操作的结果组合,返回给geo对象。

遇到的BUG

  1. 城市不能自己命名,否则会无法正常显示
  2. 如果在渲染图片的时候遇到“ReferenceError: Can‘t find variable: echarts\n\n undefined:1\nnull\n“错误,考虑项目目录中是否有中文,将其移动到纯英文目录中,问题就解决了。

这还是我google来的,仔细思考一下,can't find variable问题出在找不到echarts变量,但是echarts变量是存在的,否则画图就会报错,这样变量存在却找不到的情况,多半是路径出现问题,考虑到中文路径,以后这类Bug都可以往这方面想。

完整项目代码

github链接

成品展示
研究生城市分布
本科城市分布

总结

至此,城市分布图地图画好了!!短短的几行代码花了我六小时琢磨,反思一下:

  • 代码版本 确认用pyecharts之后,就在直接找线程的代码,以期用最短的事件完成这个任务,关键是完全没考虑到版本问题,代码粘贴下来就是一顿报错,按照我的习惯,遇上bug就找chatgpt,谁知道chatgpt给出的代码也是版本不一致,就这样带着一次成功的功利目的,花费了大量的时间内耗。这一次真切感受到了复制代码前先确定版本号的重要性。
  • 官方文档 这些用户比较少的工具,社区、博客往往不活跃,这时候文档就是救命的东西,文档永远是最新的,pip安装的也永远是最新的,所以这俩是永远适配的。一般文档都会配有快速上手,经验之谈,5分钟的快速上手可以帮助节省50分钟之多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/22886.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT中的提示工程(Prompt)怎么做?DAIR.AI最新《提示工程指南》,全面讲述提示技术,附书册课件视频...

来源:专知 提示工程是一门相对较新的学科,用于开发和优化提示,以有效地将语言模型(LM)用于各种应用和研究主题。提示工程技能有助于更好地理解大型语言模型(LLM)的能力和局限性。 研究人员使用prompt engineering来提高LLM在广泛的常见和复杂…

ChatGPT引发混乱!数千种期刊:它不能成为论文作者

本文来源:艾思科蓝整理自财新网、卫报、中国科学报、百度百科,编辑:募格学术 ChatGPT诞生才两个月,但它给全世界投下的「重磅炸弹」就没停下来过。 日前,中国人民大学首都发展与战略研究院副院长郭英剑也发表了题为“2…

【算法动画图解】:安利一款昨天发现的app

偶然看到一个app:算法动画图解,用动画的形式帮你把基础算法捋一遍,个人觉得很赞。 如下是目录。后面有空我会逐个大类更新具体内容。 1、分类 (1)冒泡排序 (2)选择性排序 (3&…

chatgpt赋能python:如何用Python制作动画?

如何用Python制作动画? Python作为一种优秀的编程语言,可以用于不同领域的编程。其中,Python也可以被用于创建动画。使用Python的主要好处之一是其强大的Matplotlib库,它可以帮助我们更轻松地创建可视化效果。 什么是Matplotlib…

GAN生成漫画脸

最近对对抗生成网络GAN比较感兴趣,相关知识点文章还在编辑中,以下这个是一个练手的小项目~ (在原模型上做了,为了减少计算量让其好训练一些。) 一、导入工具包 import tensorflow as tf from tensorflow.keras import layersimport numpy a…

拥抱毒瘤 DDD!

点击关注公众号,Java干货及时送达👇 来源:小姐姐味道 牛B的人物,早已经厌倦了中英文混杂,他们更进一步,使用中英文缩写,对普通人进行降维打击。更厉害的,造就新的名词,并…

技术人的618种草书单,这些好书值得收藏

虽然才刚刚进入 6 月,但各大网店的 618 活动都已经悄悄拉开帷幕,最近图灵君收到读者们的催更,希望我们推荐一些值得购买的书,想趁着 618 期间下手,于是火速响应大家的需求,集结了各方数据,整理出…

人工智能的黎明:从信息动力学的角度看ChatGPT| 观点

David S. Soriano, CC BY-SA 4.0 via Wikimedia Commons 导读: 以ChatGPT为代表的新的人工智能语言模型的出现与更迭,引发人们极大的兴奋和关注。 物理学家祁晓亮从信息动力学的角度分析,认为AI革命的标志是信息处理复杂度的临界点。AI还没有…

安卓集成腾讯即时通信IM完成聊天室功能

安卓集成腾讯即时通信IM完成聊天室功能 没有效果图的文章都是扯淡**请将下面的MainActivity的代码复制到源码里面,替换掉源码的MainActivity.class**话不多说,下来上代码:以上就是所有的代码附上demo源码。源码:[源码请点这里](ht…

「GPT虚拟直播」实战篇二|无人直播间如何接入虚拟人

摘要 虚拟人和数字人是人工智能技术在现实生活中的具体应用,它们可以为人们的生活和工作带来便利和创新。在直播间场景里,虚拟人和数字人可用于直播主播、智能客服、营销推广等。接入GPT的虚拟人像是加了超强buff,具备更强大的自然语言处理能…

从腾讯实时音视频发家史,看爆发中的 RTC 将何去何从

作者 | 夕颜 头图 | 下载于视觉中国 出品 | AI 科技大本营(ID:rgznai100) 早在2015年左右,直播和短视频的兴起渗透进普通人的日常生活,人们信息消费的内容已经开始从文字向语音、视频信息转变。而疫情期间全民“家里蹲”的窘境&am…

腾讯云html5直播开发,腾讯云IM开发 直播 聊天室

2019年6月工作总结 总结时间:2019年6月30日 总结人:韩放 工作内容: 1.哟呵直播开发 2.一乙农场客服商品对接 项目总结: 这个月主要是又做了一个直播类项目,这次主要的不同是根据客户的定制要求完全使用了腾讯IM加腾讯云…

微信团队分享:微信直播聊天室单房间1500万在线的消息架构演进之路

本文由微信开发团队工程师“ kellyliang”原创发表于“微信后台团队”公众号,收录时有修订和改动。 1、引言 随着直播和类直播场景在微信内的增长,这些业务对临时消息(在线状态时的实时消息)通道的需求日益增长,直播…

有哪些值得关注的AIGC细分方向?

(以下内容,来自咱们社群“AI产品经理大本营” 1月12日的团员内部讨论;本文不求大而全,但会有一些大家“没听说过的一手信息input”)‍‍‍‍ 【参与团员】 A:某司 负责 AIGC B:某司 负责 医疗AI…

音视频技术开发周刊 | 282

每周一期,纵览音视频技术领域的干货。 新闻投稿:contributelivevideostack.com。 畅谈音视频未来无限可能,2022音视频技术大会北京站 最新日程公布 2023年3月31日-4月1日,LiveVideoStackCon 2022音视频技术大会北京站,…

chatgpt赋能Python-python_cdo

Python-CDO: 数据处理的超棒工具 Python-CDO是一种极为实用的工具,用于在Python中使用CDO(Climate Data Operators)命令。CDO是一个功能强大的工具,用于处理气候和气象大型数据集,如Satellite and Reanalysis数据。而…

时间序列分析——基于R | 第2章 时间序列的预处理习题代码

时间序列分析——基于R | 第2章 时间序列的预处理习题 1.考虑序列{1,2,3,4,5,…,20} 1.1判断该序列是否平稳 x <- seq(1,20);x ## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 1.2样本自相关系数 max_lag <- 6 acf_x <- acf(x, lag.max max_l…

Google 人机验证(reCaptcha)无法显示解决方案

Google 人机验证无法显示解决方案 第一步 安装插件Chrome/Edge 电脑版Firefox 电脑版 第二步 配置插件原理参考文章 前言&#xff1a;为了防止机器人攻击&#xff0c;国外很多网站都使用了 Google reCaptcha 验证码。reCaptcha 对于国外用户非常的友好&#xff0c;但是… 对于国…

解决谷歌人机验证(Captcha)显示问题

文章目录 前言一、Header Editor 下载、安装与配置1. 插件下载2. 插件安装3. 插件配置 前言 由于谷歌服务在国内不可用&#xff0c;所以正常访问时某些网址时&#xff0c;经常会出现需要人机验证的问题&#xff0c;影响正常使用。在不使用科学上网的情况下&#xff0c;我们可以…

利用Python解决掉谷歌人机验证,全自动识别真的牛啊

一、接触前感受 第一次带我领略yolov5风骚的是这个视频&#xff1a;【亦】警惕AI外挂&#xff01;我写了一个枪枪爆头的视觉AI&#xff0c;又亲手“杀死”了它。 这样一来&#xff0c;我对人工智能打游戏产生了浓厚的兴趣&#xff0c;于是在B站查找人工智能基础&#xff0c;随便…