详解用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开发的小球完全弹性碰撞游戏代码
Oct 15 Python
python 开发的三种运行模式详细介绍
Jan 18 Python
python 内置函数filter
Jun 01 Python
Python基于回溯法子集树模板解决取物搭配问题实例
Sep 02 Python
python中lambda()的用法
Nov 16 Python
对Python发送带header的http请求方法详解
Jan 02 Python
Python字符串的全排列算法实例详解
Jan 07 Python
django 类视图的使用方法详解
Jul 24 Python
python 比较字典value的最大值的几种方法
Apr 17 Python
python列表的逆序遍历实现
Apr 20 Python
python实现在内存中读写str和二进制数据代码
Apr 24 Python
python3.6使用SMTP协议发送邮件
May 20 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
php读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
2012/07/31 PHP
字符串长度函数strlen和mb_strlen的区别示例介绍
2014/09/09 PHP
laravel-admin自动生成模块,及相关基础配置方法
2019/10/08 PHP
jQuery-Tools-overlay 使用介绍
2012/07/14 Javascript
js获取location.href的参数实例代码
2013/08/02 Javascript
jquery ajax修改全局变量示例代码
2013/11/08 Javascript
三种动态加载js的jquery实例代码另附去除js方法
2014/04/30 Javascript
js如何实现淡入淡出效果
2020/11/18 Javascript
JQuery动态添加Select的Option元素实现方法
2016/08/29 Javascript
JavaScript在form表单中使用button按钮实现submit提交方法
2017/01/23 Javascript
js中Number数字数值运算后值不对的解决方法
2017/02/28 Javascript
vue2.0.js的多级联动选择器实现方法
2018/02/09 Javascript
Redux实现组合计数器的示例代码
2018/07/04 Javascript
js的Object.assign用法示例分析
2020/03/05 Javascript
vue 组件间的通信之子组件向父组件传值的方式
2020/07/29 Javascript
[01:14:19]NAVI vs Mineski 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
Python高级应用实例对比:高效计算大文件中的最长行的长度
2014/06/08 Python
Python实现的简单hangman游戏实例
2015/06/28 Python
Python随机生成带特殊字符的密码
2016/03/02 Python
python 顺时针打印矩阵的超简洁代码
2018/11/14 Python
Python Django的安装配置教程图文详解
2019/07/17 Python
Python求正态分布曲线下面积实例
2019/11/20 Python
Python绘图实现显示中文
2019/12/04 Python
浅谈PyTorch中in-place operation的含义
2020/06/27 Python
Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)
2020/07/20 Python
Python接收手机短信的代码整理
2020/08/02 Python
Perfume’s Club澳大利亚官网:西班牙领先的在线美容店
2021/02/01 全球购物
校园歌手大赛策划书
2014/01/17 职场文书
单位工作证明书格式
2014/10/04 职场文书
房屋登记授权委托书范本
2014/10/09 职场文书
后进基层党组织整改方案
2014/10/25 职场文书
领导干部失职检讨书
2015/05/05 职场文书
2016教师国培研修感言
2015/12/08 职场文书
redis配置文件中常用配置详解
2021/04/14 Redis
详细聊聊浏览器是如何看闭包的
2021/11/11 Javascript
《游戏王:大师决斗》将推出新卡牌包4月4日上线
2022/03/31 其他游戏