详解用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 相关文章推荐
浅谈scrapy 的基本命令介绍
Jun 13 Python
Python 处理文件的几种方式
Aug 23 Python
python实现统计代码行数的小工具
Sep 19 Python
python模块常用用法实例详解
Oct 17 Python
python tkinter canvas使用实例
Nov 04 Python
mac在matplotlib中显示中文的操作方法
Mar 06 Python
Python小白垃圾回收机制入门
Jun 09 Python
python操作微信自动发消息的实现(微信聊天机器人)
Jul 14 Python
Matlab中plot基本用法的具体使用
Jul 17 Python
Python 实现国产SM3加密算法的示例代码
Sep 21 Python
Python环境配置实现pip加速过程解析
Nov 27 Python
如何理解python接口自动化之logging日志模块
Jun 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
详解php比较操作符的安全问题
2015/12/03 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
php创建类并调用的实例方法
2019/09/25 PHP
JQuery的一些小应用收集
2010/03/27 Javascript
浅析jQuery中常用的元素查找方法总结
2013/07/04 Javascript
用js模拟struts2的多action调用示例
2014/05/19 Javascript
jQuery自动添加表单项的方法
2015/07/13 Javascript
jQuery获取及设置表单input各种类型值的方法小结
2016/05/24 Javascript
JS获取及验证开始结束日期的方法
2016/08/20 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
利用Mongoose让JSON数据直接插入或更新到MongoDB
2017/05/03 Javascript
微信小程序 监听手势滑动切换页面实例详解
2017/06/15 Javascript
vue单页应用中如何使用jquery的方法示例
2017/07/27 jQuery
用node-webkit把web应用打包成桌面应用(windows环境)
2018/02/01 Javascript
vue2.0实现音乐/视频播放进度条组件
2018/06/06 Javascript
在微信小程序中使用vant的方法
2019/06/07 Javascript
详解Nuxt.js中使用Element-UI填坑
2019/09/06 Javascript
vue图片上传组件使用详解
2019/12/23 Javascript
vue用elementui写form表单时,在label里添加空格操作
2020/08/13 Javascript
ant-design-vue 时间选择器赋值默认时间的操作
2020/10/27 Javascript
Vue多选列表组件深入详解
2021/03/02 Vue.js
[01:34]完美“圣”典宣传片震撼发布,12.17与你不见不散
2016/12/16 DOTA
Python获取网页上图片下载地址的方法
2015/03/11 Python
Python的Flask框架中的Jinja2模板引擎学习教程
2016/06/30 Python
python 队列详解及实例代码
2016/10/18 Python
Python pandas对excel的操作实现示例
2020/07/21 Python
PyChon中关于Jekins的详细安装(推荐)
2020/12/28 Python
HTML5 Blob 实现文件下载功能的示例代码
2019/11/29 HTML / CSS
Regatta官网:英国最受欢迎的户外服装和鞋类品牌
2019/05/01 全球购物
新西兰优惠网站:Treat Me
2019/07/04 全球购物
Myprotein中国网站:欧洲畅销运动营养品牌
2021/02/11 全球购物
大四毕业生学习总结的自我评价
2013/10/31 职场文书
翻译专业应届生求职信
2013/11/23 职场文书
教师四风问题整改措施
2014/09/25 职场文书
实习证明格式范文
2015/06/16 职场文书
pandas DataFrame.shift()函数的具体使用
2021/05/24 Python