pyecharts案例实践

最近在做一个数据分析的任务,需要用到一些可视化的分析工具。python中首选的可视化分析工具一般就是matplotlib和seaborn,搭配pandas可以绘制很多丰富的图形,但是总觉得和那些高大上的可视化大屏、前端页面差了点感觉,因此花了半天时间研究了一下pyecharts,因为并不是从事前端开发工作,也没有任何js、html基础,因此都是比着官网demo照葫芦画瓢,然后再凭自己感觉调试,部分程序存在一些冗余,没有优化,不过虽然还不能和那些高大上的页面比较,不过好像也有点那味了。O(∩_∩)O哈哈~

Echarts 是一个由百度开源的数据可视化工具,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,pyecharts 诞生了。pyecharts囊括了 30+ 种常见图表,各种图表应有尽有,支持主流 Notebook 环境Jupyter Notebook 和 JupyterLab,还可轻松集成至 Flask,Django 等主流 Web 框架,最重要的是官方资料非常丰富,只要懂python语法的人,一般都能使用。这里推荐两个文档:pyecharts中文文档pyecharts画廊,尤其是后者,很多程序可以直接拿来使用。pyecharts的安装也非常简单,直接执行 pip install pyecharts 即可。本文的案例都是基于 Jupyter Notebook 环境和 pyecharts 1.8开发的。另外,还需要注意的一点是,pyecharts目前只支持python原生的数据类型,如int、float等,不支持封装后的数据类型,如 np.int32、np.float32等,因此在使用pyecharts时,最后把 numpy、pandas等数据类型转换为list

一、柱状图 Bar

1.1 基础绘制

from pyecharts.charts import Bar
from pyecharts import options as opts
from pyecharts.globals import ThemeType

bar = (
    Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))  ##画布主题
    .add_xaxis(data.index.to_list())  ##X轴
    .add_yaxis(None, data.values.tolist())    ##Y轴
    .set_global_opts(title_opts=opts.TitleOpts(title="商户注册时间分布",pos_right='45%',pos_top='5%'),
                    xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45))) ##标题和X轴角度
)
bar.render_notebook()

1.2 设置画布大小

bar = (
    Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT,width="800px",height="400px"))
    .add_xaxis(data.index.to_list())
    .add_yaxis(None, data.values.tolist())
    .set_global_opts(title_opts=opts.TitleOpts(title="类目分布",pos_right='45%',pos_top='5%'),
                    xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)))
)
bar.render_notebook()

1.3 堆叠柱状图

Bar(init_opts=opts.InitOpts(theme=ThemeType.PURPLE_PASSION))
    .add_xaxis(x1)
    .add_yaxis("女性", y0, stack="stack1")
    .add_yaxis("男性", y1, stack="stack1")
    .add_yaxis("未知", y2, stack="stack1")
    .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    .set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)))
    .render_notebook()

## x1是横坐标列表,y0、y1、y2是三个纵坐标列表

 

二、仪表盘 Gauge

2.1 基础绘制

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


c = (
    Gauge(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
    .add(
        "",
        [("付费商户", 31.1)],
        title_label_opts=opts.LabelOpts(
            font_size=20, color="black", font_family="Microsoft YaHei"
        ),
        detail_label_opts=opts.GaugeDetailOpts(offset_center=[0,"40%"])
    )
    .set_global_opts(title_opts=opts.TitleOpts(title="付费商户占比",pos_right='43%',pos_top='5%'))
)
c.render_notebook()

三、饼状图 Pie

3.1 基础绘制

from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker


c = (
    Pie()
    .add("", [['男',142239],['女','2462693'],['未知',255501]])
    .set_colors(["red", "purple", "orange"])
    .set_global_opts(title_opts=opts.TitleOpts(title="用户性别分布",pos_right='43%',pos_top='top'),
                    legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical",pos_top='20%'))
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}",font_size=20))
)
c.render_notebook()

四、地形图 Map

4.1 基础绘制

import pyecharts.options as opts
from pyecharts.globals import ThemeType
from pyecharts.commons.utils import JsCode
from pyecharts.charts import Timeline, Grid, Bar, Map, Pie

map_chart = (
        Map()
        .add(
            series_name="",
            data_pair=map_data,
            label_opts=opts.LabelOpts(is_show=True),
            is_map_symbol_show=False,
            itemstyle_opts={
                "normal": {"areaColor": "#323c48", "borderColor": "#404a59"},
                "emphasis": {
                   # "label": {"show": Timeline},
                    "areaColor": "rgba(255,255,255, 0.5)",
                },
            },
        )
    .set_global_opts(
            title_opts=opts.TitleOpts(
                title="国内用户分布",
                #subtitle="GDP单位:亿元",
                pos_left="center",
                pos_top="top",
                title_textstyle_opts=opts.TextStyleOpts(
                    font_size=25, color="rgba(255,255,255, 0.9)"
                ),
            ),
        tooltip_opts=opts.TooltipOpts(
                is_show=True,
                formatter=JsCode(
                    """function(params) {
                    if ('value' in params.data) {
                        return params.data.value[2] + ': ' + params.data.value[0];
                    }
                }"""
                ),
            ),
        visualmap_opts=opts.VisualMapOpts(
                is_calculable=True,
                dimension=0,
                pos_left="10",
                pos_top="center",
                range_text=["High", "Low"],
                range_color=["lightskyblue", "yellow", "orangered"],
                textstyle_opts=opts.TextStyleOpts(color="#ddd"),
                min_=min_data,
                max_=max_data,
            ),
    )
)

bar_x_data = [x[0] for x in map_data]

bar_y_data = [{"name": x[0], "value": x[1][0]} for x in map_data]
bar = (
    Bar()
    .add_xaxis(xaxis_data=bar_x_data)
    .add_yaxis(
        series_name="",
        yaxis_index=1,
        y_axis=bar_y_data,
        #yaxis_data=bar_y_data,
#             label_opts=opts.LabelOpts(
#                 is_show=True, position="right", formatter="{b}: {c}"
#             ),
    )
    .reversal_axis()
    .set_global_opts(
        xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(is_show=False)),
        yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(is_show=False)),
        tooltip_opts=opts.TooltipOpts(is_show=False),
        visualmap_opts=opts.VisualMapOpts(
            is_calculable=True,
            dimension=0,
            pos_left="10",
            pos_top="center",
            range_text=["High", "Low"],
            range_color=["lightskyblue", "yellow", "orangered"],
            textstyle_opts=opts.TextStyleOpts(color="#ddd"),
            min_=min_data,
            max_=max_data,
        ),
        graphic_opts=[
            opts.GraphicGroup(
                graphic_item=opts.GraphicItem(
                    rotation=JsCode("Math.PI / 4"),
                    bounding="raw",
                    right=110,
                    bottom=110,
                    z=100,
                ),   
            )
        ],
    )
)

pie_data = [[x[0], x[1][0]] for x in map_data]
percent_sum = sum([x[1][1] for x in map_data])
rest_value = 0
for d in map_data:
    rest_percent = 100.0
    rest_percent = rest_percent - percent_sum
    rest_value = d[1][0] * (rest_percent / d[1][1])
pie_data.append(["其他省份", rest_value])

pie = (
    Pie()
    .add(
        series_name="",
        data_pair=pie_data,
        radius=["12%", "20%"],
        center=["90%", "85%"],
        itemstyle_opts=opts.ItemStyleOpts(
            border_width=1, border_color="rgba(0,0,0,0.3)"
        ),
    )
    .set_global_opts(
        tooltip_opts=opts.TooltipOpts(is_show=True, formatter="{b} {d}%"),
        legend_opts=opts.LegendOpts(is_show=False),
    )
)
    
grid_chart = (
        Grid(init_opts=opts.InitOpts(width="1500px", height="800px", theme=ThemeType.DARK))
        .add(
            bar,
            grid_opts=opts.GridOpts(
                pos_left="0", pos_right="100%", pos_top="100%", pos_bottom="0"
            ), ##这部分功能暂时不用,使用100%隐掉
        )
        .add(pie, grid_opts=opts.GridOpts())
        .add(map_chart, grid_opts=opts.GridOpts())
    )

grid_chart.render_notebook()


'''
map_data 格式如下
map_data = [['广东',[57271,10,'广东']],
      ['山东',[36538,10,'山东']],
      ['江苏',[33928,10,'江苏']],
      ['河南',[28743,10,'河南']],
      ['吉林',[19804,10,'吉林']],
      ['山西',[18391,10,'山西']],
      ['广西',[17302,10,'广西']],
      ['青海',[110,10,'青海']]]

min_data, max_data = (
        min([d[1][0] for d in map_data]),
        max([d[1][0] for d in map_data]),
    )
'''

五、折线图 Line

4.1 双折线双Y轴

import pyecharts.options as opts
from pyecharts.globals import ThemeType
from pyecharts.commons.utils import JsCode
from pyecharts.charts import Timeline, Grid, Bar, Map, Pie


week_name_list = money_total.index.to_list()#["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
high_temperature = money_total['笔数'].to_list()#[11, 11, 15, 13, 12, 13, 10]
low_temperature = money_total['金额'].to_list()#[0.1, 0.2, 0.2, 0.5, 0.3, 0.2, 0.6]

line1 = Line(init_opts=opts.InitOpts(width="1000px", height="500px",theme=ThemeType.DARK)).add_xaxis(xaxis_data=week_name_list).add_yaxis(
        series_name="笔数",
        y_axis=high_temperature,
        markpoint_opts=opts.MarkPointOpts(
            data=[
                opts.MarkPointItem(type_="max", name="最大值"),
                opts.MarkPointItem(type_="min", name="最小值"),
            ]
        ),
        label_opts=opts.LabelOpts(is_show=False)
#         markline_opts=opts.MarkLineOpts(
#             data=[opts.MarkLineItem(type_="average", name="平均值")]
#         ),
    ).set_global_opts(
#         title_opts=opts.TitleOpts(title="未来一周气温变化"),
#         tooltip_opts=opts.TooltipOpts(trigger="axis"),
        toolbox_opts=opts.ToolboxOpts(is_show=False),
        xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=False),
    )

line1.extend_axis(yaxis=opts.AxisOpts())
line2 = Line().add_xaxis(week_name_list).add_yaxis("金额", low_temperature, yaxis_index=1,markpoint_opts=opts.MarkPointOpts(
            data=[
                opts.MarkPointItem(type_="max", name="最大值"),
                opts.MarkPointItem(type_="min", name="最小值"),
            ]
        ),label_opts=opts.LabelOpts(is_show=False))
line1.overlap(line2)
line1.render_notebook()


'''
重点是 line1.extend_axis(yaxis=opts.AxisOpts())
line1.overlap(line2)
'''

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值