详解用pyecharts Geo实现动态数据热力图城市找不到问题解决


Posted in Python onJune 26, 2019

pyecharts 是一个用于生成 Echarts 图表的类库。 Echarts 是百度开源的一个数据可视化 JS 库。主要用于数据可视化。

本文主要是用pycharts中的Geo绘制中国地图,在图中显示出各个地区的人均销售额

传入的数据形如:[('上海',30), ('北京',50), ... ...]

详解用pyecharts Geo实现动态数据热力图城市找不到问题解决

li=[]
for i,row in filtered.iterrows():
 li.append((row['city'],int(row['per_capita'])))
 
geo = Geo("sales per capita", "city", title_color="#fff", title_pos="center", width=1200, height=600, background_color='#404a59')
attr, value = geo.cast(li)
geo.add("", attr, value, visual_range=[187, 820], visual_text_color="#fff", symbol_size=15, is_visualmap=True)
geo.show_config()
geo.render()
 
geo = Geo("全国主要城市空气质量", "data from pm2.5", title_color="#fff", title_pos="center", width=1200, height=600,
   background_color='#404a59')
attr, value = geo.cast(li)
geo.add("", attr, value, type="heatmap", is_visualmap=True, visual_range=[200, 300], visual_text_color='#fff')
geo.show_config()
geo.render()
 
geo = Geo("全国主要城市空气质量", "data from pm2.5", title_color="#fff", title_pos="center",
   width=1200, height=600, background_color='#404a59')
attr, value = geo.cast(li)
geo.add("", attr, value, type="effectScatter", is_random=True, effect_scale=5)
geo.show_config()
geo.render()

原来的包的问题是,经纬度非常不全,一旦有找不到的,就画不出来,方案一是把找不到的数据删掉再画

另一种办法是到百度地图api里把找不到的地方的经纬度加进原始的包里

搜索:百度地图api-》地图api示例-》地址解析

详解用pyecharts Geo实现动态数据热力图城市找不到问题解决

详解用pyecharts Geo实现动态数据热力图城市找不到问题解决

详解用pyecharts Geo实现动态数据热力图城市找不到问题解决

详解用pyecharts Geo实现动态数据热力图城市找不到问题解决

复制这些经纬度;

打开pyecharts包里的base.py,找到记录经纬度信息的地方,把刚才的经纬度信息补上去

详解用pyecharts Geo实现动态数据热力图城市找不到问题解决

如此便可以把所有数据都呈现在地图上了

如果我想动态选择年份(2013-2017)以及选择展现不同数据维度(人均消费额,总消费额)怎么办?

这里要介绍一个python的模板引擎jinja2,该引擎仿照Django设计。模板是文本,用于分离文档的形式和内容,具体的介绍和用法可以看下面两个链接

https://3water.com/article/163962.htm

http://docs.jinkan.org/docs/jinja2/templates.html

最基本的方法是通过Template创建模板并且渲染

from jinja2 import Template
 
template = Template('Hello {{string}}!')
template.render(string='world')

除了普通的字符串变量,jinja2还支持列表,字典和对象,

{{ mydict['key'] }}
{{ mylist[3] }}
{{ mylist[myintvar] }}
{{ myobj.somemethod() }}
{{myobj.someattribute}}

于是我们可以通过创建一个字典,将不同年份不同维度的数据都放入字典中,在展示数据时,将指定数据传入模板

options={}

for year in range(2013, 2018):
  options[year] = {}
  filtered = grouped[grouped['year'] == year]
  for dim in ('sales', 'per_capita'):
   li = []
   for i, row in filtered.iterrows():
    li.append((row['city'], int(row[dim])))
   if dim == 'per_capita':
    geo = Geo(dim, "city (单位:元/人)", title_color="#fff", title_pos="center", width=1200, height=600,
       background_color='#404a59')
    attr, value = geo.cast(li)
    geo.add("", attr, value, visual_range=[380, 450], visual_text_color="#fff", symbol_size=15, is_visualmap=True)
   else:
    geo = Geo(dim, "city (单位:百万)", title_color="#fff", title_pos="center", width=1200, height=600,
       background_color='#404a59')
    attr, value = geo.cast(li)
    geo.add("", attr, value, visual_range=[10, 100], visual_text_color="#fff", symbol_size=15, is_visualmap=True)
   options[year][dim] = geo._option
 with open("template.html", encoding='utf-8') as f:
  template = jinja2.Template(f.read())
 html = template.render(data=json.dumps(options))
 with open("city_chart.html", "w") as f:
  f.write(html)

通过查看base.py里的render()可以看到传入模板的是self._option

def render(self, path="render.html"):
  """ 渲染数据项,生成 html 文件
  :param path:
   生成 html 文件保存路径
  """
  from pyecharts import temple as Tp
  temple = Tp._temple
  series = self._option.get("series")
  for s in series:
   if s.get('type') == "wordCloud":
    temple = Tp._temple_wd
    break
   if s.get('type') == "liquidFill":
    temple = Tp._temple_lq
    break
  my_option = json.dumps(self._option, indent=4, ensure_ascii=False)
  __op = temple\
   .replace("myOption", my_option)\
   .replace("myWidth", str(self._width))\
   .replace("myHeight", str(self._height))
  try:  # for Python3
   with open(path, "w+", encoding="utf-8") as fout:
    fout.write(__op)
  except:  # for Python2
   with open(path, "w+") as fout:
    fout.write(__op)

template亦可仿照temple.py

<html>
 
<head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" rel="external nofollow" type="text/css">
 <link rel="stylesheet" href="https://pingendo.github.io/templates/blank/theme.css" rel="external nofollow" type="text/css">
 <link href="https://cdn.bootcss.com/bootstrap-select/2.0.0-beta1/css/bootstrap-select.css" rel="external nofollow" rel="stylesheet">
 <script src="https://cdn.bootcss.com/bootstrap-select/2.0.0-beta1/js/bootstrap-select.js"></script>
 <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js"></script>
 <script src="https://pingendo.com/assets/bootstrap/bootstrap-4.0.0-alpha.6.min.js"></script>
 <script src="http://oog4yfyu0.bkt.clouddn.com/echarts.min.js"></script>
 <script type="text/javascript " src="http://echarts.baidu.com/gallery/vendors/echarts/map/js/china.js"></script>
 <script type="text/javascript " src="http://echarts.baidu.com/gallery/vendors/echarts/map/js/world.js"></script>
 <script type="text/javascript " src="http://oog4yfyu0.bkt.clouddn.com/wordcloud.js"></script>
 ... ...
 </head>
 
<body>
 <div class="py-5">
 <div class="container">
  <div class="row">
  <div class="col-md-4">
   <select class="selectpicker" id="year">
    <option>2013</option>
    <option>2014</option>
    <option>2015</option>
    <option>2016</option>
    <option>2017</option>
   </select>
  </div>
  <div class="col-md-4">
   <select class="selectpicker" id="dim">
   <option value="sales">total_sales</option>
   <option value="per_capita">sales per capita</option>
   <option value="count">count</option>
   </select>
  </div>
  <div class="col-md-4">
   <select class="selectpicker" id="customer_type">
   <option value="new_customer">new_customer</option>
   <option value="old_customer">old_customer</option>
   <option value="members">members</option>
   </select>
  </div>
  <div class="col-md-4">
   <a class="btn btn-default" href="#" rel="external nofollow" onclick="show()">refresh</a>
  </div>
  </div>
  <div class="row"> 
  <div class='col-md-12'>
    <div id="main" style="width: 1200px;height:600px;"></div>
  </div>
  </div>
 
 </div>
 </div>
<script type="text/javascript">
var data={{data}};
function show(){
 var year=$("#year").val();
 var dim=$("#dim").val();
 var customer_type=$("#customer_type").val();
 var myChart = echarts.init(document.getElementById('main'));
 var option=data[year][dim][customer_type];
 option['tooltip']={'formatter':function(params){return params['name']+':'+params['value'][2]}};
 myChart.setOption(option);
} 
$(show);//加载完文档之后运行这个函数
</script>
</body>
 
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python基于smtplib实现异步发送邮件服务
May 28 Python
在Python的Django框架中获取单个对象数据的简单方法
Jul 17 Python
python 开发的三种运行模式详细介绍
Jan 18 Python
Python使用pymysql小技巧
Jun 04 Python
python实现俄罗斯方块
Jun 26 Python
python3 对list中每个元素进行处理的方法
Jun 29 Python
python读取图片并修改格式与大小的方法
Jul 24 Python
对Python中创建进程的两种方式以及进程池详解
Jan 14 Python
VSCode Python开发环境配置的详细步骤
Feb 22 Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
Mar 23 Python
SpringBoot首页设置解析(推荐)
Feb 11 Python
Python 读取千万级数据自动写入 MySQL 数据库
Jun 28 Python
Python 数据可视化pyecharts的使用详解
Jun 26 #Python
python 实现交换两个列表元素的位置示例
Jun 26 #Python
python之信息加密题目详解
Jun 26 #Python
实例详解Python模块decimal
Jun 26 #Python
Python3之不使用第三方变量,实现交换两个变量的值
Jun 26 #Python
python 猴子补丁(monkey patch)
Jun 26 #Python
python中的decimal类型转换实例详解
Jun 26 #Python
You might like
mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
2007/01/15 PHP
php中require和require_once的区别说明
2014/02/27 PHP
ThinkPHP有变量的where条件分页实例
2014/11/03 PHP
php计算两个文件相对路径的方法
2015/03/14 PHP
php判断访问IP的方法
2015/06/19 PHP
老生常谈PHP面向对象之命令模式(必看篇)
2017/05/24 PHP
jQuery 第二课 操作包装集元素代码
2010/03/14 Javascript
JQuery 插件制作实践 xMarquee插件V1.0
2010/04/02 Javascript
IE下js调试工具Companion.JS
2010/10/15 Javascript
用jQuery中的ajax分页实现代码
2011/09/20 Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
2014/11/20 Javascript
Vue异步组件使用详解
2017/04/08 Javascript
vue2.0多条件搜索组件使用详解
2020/03/26 Javascript
React.js中常用的ES6写法总结(推荐)
2017/05/09 Javascript
Mac系统下Webstorm快捷键整理大全
2017/05/28 Javascript
vue 组件高级用法实例详解
2018/04/11 Javascript
cnpm加速Angular项目创建的方法
2018/09/07 Javascript
vue项目环境变量配置的实现方法
2018/10/12 Javascript
js Math数学简单使用操作示例
2020/03/13 Javascript
three.js 实现露珠滴落动画效果的示例代码
2021/03/01 Javascript
[00:13]天涯墨客二技能展示
2018/08/25 DOTA
python递归计算N!的方法
2015/05/05 Python
Python彩色化Linux的命令行终端界面的代码实例分享
2016/07/02 Python
利用python程序生成word和PDF文档的方法
2017/02/14 Python
python实现计算器功能
2019/10/31 Python
Django框架序列化与反序列化操作详解
2019/11/01 Python
python tkinter canvas使用实例
2019/11/04 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
2020/03/24 Python
python中turtle库的简单使用教程
2020/11/11 Python
Python做图像处理及视频音频文件分离和合成功能
2020/11/24 Python
阿迪达斯加拿大官网:Adidas加拿大
2016/08/25 全球购物
求∏的近似值,直到最后一项的绝对值小于指定的数
2016/02/12 面试题
物流专业大学应届生求职信
2013/11/03 职场文书
《槐乡五月》教学反思
2014/04/25 职场文书
农业项目建议书
2014/08/25 职场文书
会计试用期工作总结2015
2015/05/28 职场文书