详解用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的Bottle框架中获取制定cookie的教程
Apr 24 Python
在Django的URLconf中使用命名组的方法
Jul 18 Python
Python使用logging结合decorator模式实现优化日志输出的方法
Apr 16 Python
解决python2.7用pip安装包时出现错误的问题
Jan 23 Python
python实现图片识别汽车功能
Nov 30 Python
Python 监测文件是否更新的方法
Jun 10 Python
Python基础学习之类与实例基本用法与注意事项详解
Jun 17 Python
详解Python 中sys.stdin.readline()的用法
Sep 12 Python
Pandas 缺失数据处理的实现
Nov 04 Python
Python进程池Pool应用实例分析
Nov 27 Python
python连接mongodb集群方法详解
Feb 13 Python
Python实现UDP程序通信过程图解
May 15 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
图象函数中的中文显示
2006/10/09 PHP
php里array_work用法实例分析
2015/07/13 PHP
Zend Framework框架教程之Zend_Db_Table_Rowset用法实例分析
2016/03/21 PHP
php微信公众平台开发(四)回复功能开发
2016/12/06 PHP
PHP编程实现的TCP服务端和客户端功能示例
2018/04/13 PHP
php 实现银联商务H5支付的示例代码
2019/10/12 PHP
Laravel框架实现定时Task Scheduling例子
2019/10/22 PHP
Prototype 1.5.0_rc1 及 Prototype 1.5.0 Pre0小抄本
2006/09/22 Javascript
JavaScript中的Screen屏幕对象
2008/01/16 Javascript
一些经常会用到的Javascript检测函数
2010/05/31 Javascript
Js event事件在IE、FF兼容性问题
2011/01/01 Javascript
简单的邮箱登陆的提示效果类似于yahoo邮箱
2014/02/26 Javascript
js 触发select onchange事件代码
2014/03/20 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
2014/05/04 Javascript
Jquery 效果使用详解
2015/11/23 Javascript
js实现C#的StringBuilder效果完整实例
2015/12/22 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
2015/12/23 Javascript
手机端实现Bootstrap简单图片轮播效果
2016/10/13 Javascript
jQuery的extend方法【三种】
2016/12/14 Javascript
JavaScript使用享元模式实现文件上传优化操作示例
2018/08/07 Javascript
vue如何根据网站路由判断页面主题色详解
2018/11/02 Javascript
如何处理Python3.4 使用pymssql 乱码问题
2016/01/08 Python
在java中如何定义一个抽象属性示例详解
2017/08/18 Python
python如何实现int函数的方法示例
2018/02/19 Python
Python库安装速度过慢解决方案
2020/07/14 Python
python try...finally...的实现方法
2020/11/25 Python
js实现移动端H5页面手指滑动刻度尺功能
2017/11/16 HTML / CSS
凯普林包包西班牙官网:Kipling西班牙
2019/04/12 全球购物
解释一下Windows的消息机制
2014/01/30 面试题
公务员群众路线专题民主生活会发言材料
2014/09/17 职场文书
专题组织生活会思想汇报
2014/10/01 职场文书
护理见习报告范文
2014/11/03 职场文书
2015年乡镇安全生产工作总结
2015/05/19 职场文书
热爱劳动主题班会
2015/08/14 职场文书
2016学校先进集体事迹材料
2016/02/29 职场文书
详细了解java监听器和过滤器
2021/07/09 Java/Android