pyecharts 结合Echarts的python可视化包

我们知道在python的世界里画图的工具很多,例如之前说到的streamlit matplotlib.pyplot , 而今天我们要介绍另外一个python环境的画图利器。pyecharts是一个国人开发的一个Echarts与Python结合的轮子,是一款将python与echarts结合的强大的数据可视化工具。Apache ECharts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,pyecharts 诞生了。

1、前言

有一点注意,就是python2.x和python3.x的编码问题,在python3.x中你可以把它看做默认是unicode编码,但在python2.x中并不是默认的,原因就在它的bytes对象定义的混乱,而pycharts是使用unicode编码来处理字符串和文件的,所以当你使用的是python2.x时,请务必在上方插入此代码:

from future import unicode_literals

2、安装

pip install pyecharts
# 由于墙的原因,下载时会出现断线和速度过慢的问题导致下载失败;可用下边方式优化
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyecharts

3、全局配置项(visualmapopts 视觉映射配置项)

# 先引入相关包
from pyecharts import options as opts
from pyecharts.charts import Map
from pyecharts.faker import Faker

3、1 分段型配置

cq_city = ["北碚区", "巴南区", "渝北区", "九龙坡区","渝中区","江北区","南岸区","沙坪坝区","大渡口区"]
GDP_value = [552, 781, 1443, 1211,1204,1028,725,936,228]

c = (
    Map()
    .add("", [list(z) for z in zip(cq_city, GDP_value)], "重庆",is_map_symbol_show=False,) #不显示标记图形
    .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) #不显示标签(城市名)
    .set_global_opts(
            # VisualMapOpts:视觉映射配置项
        visualmap_opts=opts.VisualMapOpts(max_=2000,
                                              is_piecewise=True,
                                              pieces=[
                                                  {"max": 1499, "min": 1200, "label": ">=1200", "color": "#B40404"},
                                                  {"max": 1199, "min": 900, "label": "900-1199", "color": "#DF0101"},
                                                  {"max": 899, "min": 600, "label": "600-899", "color": "#F78181"},
                                                  {"max": 599, "min": 300, "label": "300-599", "color": "#F5A9A9"},
                                                  {"max": 299, "min": 0, "label": "0-299", "color": "#FFFFCC"},
                                              ]
    ))
    .render("chongqing.html")
)
pyecharts 全局配置 分段型图

3、2 不分段型配置

c = (
    Map()
        .add("", [list(z) for z in zip(cq_city, Faker.values())], "重庆",
             is_map_symbol_show=False, )  # 不显示标记图形
        .set_series_opts(label_opts=opts.LabelOpts(is_show=False))  # 不显示标签(城市名)
        .set_global_opts(
        # VisualMapOpts:视觉映射配置项
        visualmap_opts=opts.VisualMapOpts(
            # 是否显示视觉映射配置
            is_show=True,

            # 映射过渡类型,可选,"color", "size"  (颜色映射还是大小映射)(重要!!!)
            type_="color",

            # 指定 visualMapPiecewise 组件的最小值。
            min_=0,

            # 指定 visualMapPiecewise 组件的最大值。
            max_=100,

            # 两端的文本,如['High', 'Low'],(自定义) range_text: Union[list, tuple] = None,
            range_text=['高', '低'],

            # visualMap 组件过渡颜色 (可以自定义)(颜色从淡到深) range_color: Union[Sequence[str]] = None,
            range_color=['#CCEBFF', '#22DDDD', '#0099FF', '#003D66'],

            # visualMap 组件过渡 symbol 大小.range_size: Union[Sequence[int]] = None,
            range_size=None,

            # visualMap 图元以及其附属物(如文字标签)的透明度。range_opacity: Optional[Numeric] = None,
            range_opacity=None,

            # 如何放置 visualMap 组件,水平('horizontal')或者竖直('vertical')。
            orient='horizontal',

            # visualMap 组件离容器左侧的距离。
            # left 的值可以是像 20 这样的具体像素值,可以是像 '20%' 这样相对于容器高宽的百分比,
            # 也可以是 'left', 'center', 'right'。
            # 如果 left 的值为'left', 'center', 'right',组件会根据相应的位置自动对齐。
            pos_left='center',

            # visualMap 组件离容器右侧的距离(同上)。
            # right 的值可以是像 20 这样的具体像素值,可以是像 '20%' 这样相对于容器高宽的百分比。
            pos_right=None,

            # visualMap 组件离容器上侧的距离(同上)。
            # top 的值可以是像 20 这样的具体像素值,可以是像 '20%' 这样相对于容器高宽的百分比,
            # 也可以是 'top', 'middle', 'bottom'。
            # 如果 top 的值为'top', 'middle', 'bottom',组件会根据相应的位置自动对齐。
            pos_top=None,

            # visualMap 组件离容器下侧的距离(同上)。
            # bottom 的值可以是像 20 这样的具体像素值,可以是像 '20%' 这样相对于容器高宽的百分比。
            pos_bottom=None,

            # 对于连续型数据,自动平均切分成几段。默认为5段。连续数据的范围需要 max 和 min 来指定
            split_number=5,

            # 指定取哪个系列的数据,默认取所有系列。series_index: Union[Numeric, Sequence, None] = None,
            series_index=None,

            # 组件映射维度Optional[Numeric]
            dimension=None,

            # 是否显示拖拽用的手柄(手柄能拖拽调整选中范围)。
            is_calculable=True,

            # 是否为分段型
            is_piecewise=False,

            # 是否反转 visualMap 组件(默认False)
            is_inverse=True,

            # 自定义的每一段的范围,以及每一段的文字,以及每一段的特别的样式。例如:
            # pieces: [
            #   {"min": 1500}, // 不指定 max,表示 max 为无限大(Infinity)。
            #   {"min": 900, "max": 1500},
            #   {"min": 310, "max": 1000},
            #   {"min": 200, "max": 300},
            #   {"min": 10, "max": 200, "label": '10 到 200(自定义label)'},
            #   {"value": 123, "label": '123(自定义特殊颜色)', "color": 'grey'}, //表示 value 等于 123 的情况
            #   {"max": 5}     // 不指定 min,表示 min 为无限大(-Infinity)。
            # ]
            pieces=None,

            # 定义 在选中范围外 的视觉元素。(用户可以和 visualMap 组件交互,用鼠标或触摸选择范围)
            #  可选的视觉元素有:
            #  symbol: 图元的图形类别。
            #  symbolSize: 图元的大小。
            #  color: 图元的颜色。
            #  colorAlpha: 图元的颜色的透明度。
            #  opacity: 图元以及其附属物(如文字标签)的透明度。
            #  colorLightness: 颜色的明暗度,参见 HSL。
            #  colorSaturation: 颜色的饱和度,参见 HSL。
            #  colorHue: 颜色的色调,参见 HSL。
            out_of_range=None,

            # 图形的宽度,即长条的宽度。
            item_width=0,

            # 图形的高度,即长条的高度。
            item_height=0,

            # visualMap 组件的背景色。
            background_color='#CCCC33',

            # visualMap 组件的边框颜色。
            border_color='#EE1111',

            # visualMap 边框线宽,单位px。
            border_width=2,

            # 文字样式配置项,参考 `series_options.TextStyleOpts`
            textstyle_opts=None,
        )
    )
        .render("chongqing1.html")
)

4、柱状图-Bar

#导入柱状图-Bar
from pyecharts.charts import Bar
bar = (
    Bar()
    .add_xaxis(["衬衫", "毛衣", "领带", "裤子", "风衣", "高跟鞋", "袜子"])
    .add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105])
    .add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49])
    .set_global_opts(title_opts=opts.TitleOpts(title="某商场销售情况"))
)
bar.render()
柱形图

5、3D柱状图

import random

from pyecharts import options as opts
from pyecharts.charts import Bar3D

x_data = y_data = list(range(10))


def generate_data():
    data = []
    for j in range(10):
        for k in range(10):
            value = random.randint(0, 9)
            data.append([j, k, value * 2 + 4])
    return data


bar3d = Bar3D()
for _ in range(10):
    bar3d.add(
        "",
        generate_data(),
        shading="lambert",
        xaxis3d_opts=opts.Axis3DOpts(data=x_data, type_="value"),
        yaxis3d_opts=opts.Axis3DOpts(data=y_data, type_="value"),
        zaxis3d_opts=opts.Axis3DOpts(type_="value"),
    )
bar3d.set_global_opts(title_opts=opts.TitleOpts("Bar3D-堆叠柱状图示例"))
bar3d.set_series_opts(**{"stack": "stack"})
bar3d.render("bar3d_stack.html")
3D柱状图

6、饼图

from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.commons.utils import JsCode


fn = """
    function(params) {
        if(params.name == '其他')
            return '\\n\\n\\n' + params.name + ' : ' + params.value + '%';
        return params.name + ' : ' + params.value + '%';
    }
    """


def new_label_opts():
    return opts.LabelOpts(formatter=JsCode(fn), position="center")


c = (
    Pie()
    .add(
        "",
        [list(z) for z in zip(["剧情", "其他"], [25, 75])],
        center=["20%", "30%"],
        radius=[60, 80],
        label_opts=new_label_opts(),
    )
    .add(
        "",
        [list(z) for z in zip(["奇幻", "其他"], [24, 76])],
        center=["55%", "30%"],
        radius=[60, 80],
        label_opts=new_label_opts(),
    )
    .add(
        "",
        [list(z) for z in zip(["爱情", "其他"], [14, 86])],
        center=["20%", "70%"],
        radius=[60, 80],
        label_opts=new_label_opts(),
    )
    .add(
        "",
        [list(z) for z in zip(["惊悚", "其他"], [11, 89])],
        center=["55%", "70%"],
        radius=[60, 80],
        label_opts=new_label_opts(),
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="Pie-多饼图基本示例"),
        legend_opts=opts.LegendOpts(
            type_="scroll", pos_top="20%", pos_left="80%", orient="vertical"
        ),
    )
    .render("mutiple_pie.html")
)
复杂饼图

7、雷达图

from pyecharts import options as opts
from pyecharts.charts import Radar

data = [{"value": [4, -4, 2, 3, 0, 1], "name": "预算分配"}]
c_schema = [
    {"name": "销售", "max": 4, "min": -4},
    {"name": "管理", "max": 4, "min": -4},
    {"name": "技术", "max": 4, "min": -4},
    {"name": "客服", "max": 4, "min": -4},
    {"name": "研发", "max": 4, "min": -4},
    {"name": "市场", "max": 4, "min": -4},
]
c = (
    Radar()
    .set_colors(["#4587E7"])
    .add_schema(
        schema=c_schema,
        shape="circle",
        center=["50%", "50%"],
        radius="80%",
        angleaxis_opts=opts.AngleAxisOpts(
            min_=0,
            max_=360,
            is_clockwise=False,
            interval=5,
            axistick_opts=opts.AxisTickOpts(is_show=False),
            axislabel_opts=opts.LabelOpts(is_show=False),
            axisline_opts=opts.AxisLineOpts(is_show=False),
            splitline_opts=opts.SplitLineOpts(is_show=False),
        ),
        radiusaxis_opts=opts.RadiusAxisOpts(
            min_=-4,
            max_=4,
            interval=2,
            splitarea_opts=opts.SplitAreaOpts(
                is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)
            ),
        ),
        polar_opts=opts.PolarOpts(),
        splitarea_opt=opts.SplitAreaOpts(is_show=False),
        splitline_opt=opts.SplitLineOpts(is_show=False),
    )
    .add(
        series_name="预算",
        data=data,
        areastyle_opts=opts.AreaStyleOpts(opacity=0.1),
        linestyle_opts=opts.LineStyleOpts(width=1),
    )
    .render("radar_angle_radius_axis.html")
)
雷达图

8、基本操作流程

  • 导入相关图表包
  • 进行图表的基础设置,创建图表对象
  • 利用add()方法进行数据输入与图表设置(可以使用print_echarts_options()来输出所有可配置项)
  • 利用render()方法来进行图表保存