Python 数据可视化

2018-09-21  本文已影响0人  dawsonenjoy

本文主要讲pyecharts模块,基于0.1.9.4版本(可以当做是0.5.x版本的弱化版,少了一些参数配置等,文档参考:0.5.x版本官方文档),需要:pip install pyecharts==0.1.9.4
注:
1.0+版本和之前的有很大变化(修复了之前的不少BUG),但只支持python3.6+,所以代码上将可能出现不兼容情况(包括导包、语法等),具体可以参考下面的文章:
0.5+和1.0+版本区别及简单示例
1.0+版本简单代码示例
其中文档参考:1.0+版本官方文档

简单示例

因为是要在网页中图形化展示,所以需要在web框架下,或者jupyter下运行

柱形图
from pyecharts import Bar
bar = Bar("我的第一个图表", "这里是副标题", width=1200, height=800)
bar.add("服装", ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"], [5, 20, 36, 10, 75, 90],is_more_utils=True)
#堆叠型柱形图就加个:is_stack=True就行了
bar.show_config()
bar.render()

堆叠型
折线图
from pyecharts import Line
line = Line("我的第一个图表", "这里是副标题", width=800)
line.add("服装", ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"], [5, 20, 36, 10, 75, 90],is_more_utils=True, is_stack=True)
line.add("食品", ["猪肉", "羊肉", "牛肉", "蔬菜", "牛奶", "海鲜"], [43, 23, 3, 10, 25, 30],is_more_utils=True, is_stack=True)
line.show_config()
line.render()
饼状图
from pyecharts import Pie
attr1 = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
attr2 = ["猪肉", "羊肉", "牛肉", "蔬菜", "牛奶", "海鲜"]
data1 = [5, 20, 36, 10, 75, 90]
data2 = [43, 23, 3, 10, 25, 30]
pie = Pie("饼图", "副标题", height=900)
pie.add("服装", attr1, data1, center=[25, 50], is_random=False, radius=[30, 50], rosetype='radius', is_legend_show=True)
pie.add("食品", attr2, data2, center=[75, 50], is_random=False, radius=[30, 50], rosetype='area', is_legend_show=False)
#抬头,抬头下每个属性,每个属性对应值,圆心坐标,是否随机颜色,内径和外径,图像类型,是否将各属性展示在顶部
# pie.show_config()
pie.render()
3D散点图
from pyecharts import Scatter3D

import random
data = [[random.randint(0, 100), random.randint(0, 100), random.randint(0, 100)] for _ in range(80)]
range_color = ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf',
               '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
scatter3D = Scatter3D("3D 散点图示例", width=1200, height=600)
scatter3D.add("", data, is_visualmap=True, visual_range_color=range_color)
scatter3D.render()
地理图
from pyecharts import Geo
import random
city = ['北京', '天津', '厦门', '深圳',  '哈尔滨', '乌鲁木齐']
pm = [random.randint(0, 200) for i in range(6)]
geo = Geo("空气质量", "pm2.5", width=500, title_pos="left")
geo.add("空气指数", city, pm, visual_range=[0, 50], maptype='china', visual_text_color="#fff", is_visualmap=True)
geo.render()

注:
这些城市名及对应的经纬度都以字典形式保存在pyecharts.base_geo_cities里,可以自己去做相应配置,格式为:"城市名":[经度, 纬度]
地理图参考:

https://blog.csdn.net/u012535605/article/details/80677791

更多参考:

主要城市经纬度:https://wenku.baidu.com/view/b80ec5f15f0e7cd185253600.html
经纬度查询:http://www.gpsspg.com/maps.htm

自定义可视化文件

有时候通过render()生成的界面只有一个图表,而我们未必会想要这样的结果,比如想生成的页面有别的东西,那么我们可以通过做一些小小的改动来生成自定义的文件,首先需要进行一些配置(这里讲的是0.1.9.4版本下的配置修改):
1.到show_config()所在文件base.py下(可以通过pycharm输入show_config函数,按ctrl+鼠标左键进入文件,或者windows下去python/Lib/site-packages/pyecharts/base.py里找;linux下一般在/usr/local/lib/python/site-packages/pyecharts/base.py,或者用find -name 'pyecharts*'命令找),导入pprintpformatfrom pprint import pprint, pformat
2.找到show_config()定义的地方,把函数内容改成:

def show_config(self):
    """ Print all options of charts"""
    result = pformat(self._option)
    #把数据格式化后返回
    return result

注:在0.5.x版本下则是修改print_echarts_options函数如下:

def print_echarts_options(self):
    """ 打印输出图形所有配置项,改为将配置项返回
    """
    snippet = TRANSLATOR.translate(self.options)
    # print(snippet.as_snippet())
    return snippet.as_snippet()


我们应该尽量在避免修改源码的情况下使用模块,所以上面的步骤不建议使用,只需要把下面示例代码的第五行修改如下即可:

# 原来:
# h_middle = str(bar.show_config()).replace('None', 'null').replace('True', 'true').replace('False', 'false')
# 修改后:
from pprint import pformat
h_middle = str(pformat(bar._option)).replace('None', 'null').replace('True', 'true').replace('False', 'false')

现在我们就能够生成自定义的可视化文件了,因为echarts的使用只需要导入对应的js文件,然后把配置的数据全部赋值给var option里面就行了,不清楚的话可以先参考echarts的使用文档:
http://echarts.baidu.com/tutorial.html#5%20%E5%88%86%E9%92%9F%E4%B8%8A%E6%89%8B%20ECharts
这里生成自定义内容文件原理就是以字符串拼接方式把配置项和自定义的html文件内容拼接起来,然后保存成文件,这里上代码(第五行最好根据前一个代码块的说明来进行修改):

from pyecharts import Bar
bar = Bar("我的第一个图表", "这里是副标题", width=1200, height=800)
bar.add("服装", ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"], [5, 20, 36, 10, 75, 90],is_more_utils=True)

h_middle = str(bar.show_config()).replace('None', 'null').replace('True', 'true').replace('False', 'false')
#js里没有None、True、False,分别对应null、true、false
h_head = """<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <title></title>
 <script src="js/echarts.js"></script>
</head>
<body>
 <div id="main" style="width: 600px;height:400px;"></div>
 <script type="text/javascript">
 // 基于准备好的dom,初始化echarts实例
 var myChart = echarts.init(document.getElementById('main'));
 // 指定图表的配置项和数据
 var option = """
 #自定义的html内容,除了option地方要配置数据项以外
h_end = """;
 myChart.setOption(option);
 </script>
</body>
</html>"""
with open('render.html', 'w', encoding='utf-8') as f:
    f.write(h_head + h_middle + h_end)
    #把html和配置的数据拼起来

可以看到生成的文件内容:

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <title></title>
 <script src="js/echarts.js"></script>
</head>
<body>
 <div id="main" style="width: 600px;height:400px;"></div>
 <script type="text/javascript">
 // 基于准备好的dom,初始化echarts实例
 var myChart = echarts.init(document.getElementById('main'));
 // 指定图表的配置项和数据
 var option = {'_index_flag': 879318,
 'backgroundColor': '#fff',
 'color': ['#c23531',
           '#2f4554',
           '#61a0a8',
           '#d48265',
           '#749f83',
           '#ca8622',
           '#bda29a',
           '#6e7074',
           '#546570',
           '#c4ccd3',
           '#f05b72',
           '#ef5b9c',
           '#f47920',
           '#905a3d',
           '#fab27b',
           '#2a5caa',
           '#444693',
           '#726930',
           '#b2d235',
           '#6d8346',
           '#ac6767',
           '#1d953f',
           '#6950a1',
           '#918597',
           '#f6f5ec'],
 'legend': [{'data': ['服装'],
             'left': 'center',
             'orient': 'horizontal',
             'selectedMode': 'multiple',
             'show': true,
             'top': 'top'}],
 'series': [{'data': [5, 20, 36, 10, 75, 90],
             'indexflag': 879318,
             'label': {'emphasis': {'show': true},
                       'normal': {'formatter': null,
                                  'position': 'top',
                                  'show': false,
                                  'textStyle': {'color': '#000',
                                                'fontSize': 12}}},
             'markLine': {'data': []},
             'markPoint': {'data': []},
             'name': '服装',
             'stack': '',
             'type': 'bar'}],
 'title': [{'left': 'auto',
            'subtext': '这里是副标题',
            'subtextStyle': {'color': '#aaa', 'fontSize': 12},
            'text': '我的第一个图表',
            'textStyle': {'color': '#000', 'fontSize': 18},
            'top': 'auto'}],
 'toolbox': {'feature': {'saveAsImage': {'show': true}},
             'left': 'right',
             'orient': 'vertical',
             'show': true,
             'top': 'center'},
 'tooltip': {},
 'xAxis': [{'axisLabel': {'interval': 'auto', 'rotate': 0},
            'data': ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子'],
            'max': null,
            'min': null,
            'name': '',
            'nameGap': 25,
            'nameLocation': 'middle',
            'nameTextStyle': {'fontSize': 14},
            'type': 'category'}],
 'yAxis': [{'axisLabel': {'formatter': '{value} ', 'rotate': 0},
            'max': null,
            'min': null,
            'name': '',
            'nameGap': 25,
            'nameLocation': 'middle',
            'nameTextStyle': {'fontSize': 14},
            'type': 'value'}]};
 myChart.setOption(option);
 </script>
</body>
</html>
pyecharts安装出错参考

https://blog.csdn.net/wangxiaolin1992/article/details/80513053

更多示例参考

https://www.jianshu.com/p/c596d353a69e

其他参考

https://blog.csdn.net/u013421629/article/details/78183637?locationNum=8&fps=1
https://www.sohu.com/a/234933142_701513

上一篇 下一篇

猜你喜欢

热点阅读