前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pyecharts-14-页面组件Page

pyecharts-14-页面组件Page

作者头像
皮大大
发布2021-03-01 13:28:23
3.9K1
发布2021-03-01 13:28:23
举报

Pyecharts-14-图形组合

Pyecharts有一个非常强大的功能,就是能够将多个图形同时放在一个HTML页面中。这种方式和其他库的绘制多个子图的方式的区别在于:Pyecharts中能够自定义位置和图形大小

本文中将绘制多种不同的图形,并将它们通过页面组件Page的方式放在同一个HTML页面中。

绘制多个图形

下面将会绘制多个图形,图形中不会涉及到太多的配置,本文的重点是讲解如何将不同的图形组合在一起。

导入库
代码语言:javascript
复制
from pyecharts.globals import CurrentConfig, OnlineHostType   # 事先导入,防止不出图
from pyecharts import options as opts
from pyecharts.charts import Bar, Pie, Line, HeatMap, Funnel, Gauge, Grid, Page   # 6个图形+2个组件
from pyecharts.faker import Faker
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ThemeType
from pyecharts.globals import SymbolType

import pandas as pd
import numpy as np
import random

#显示所有列
# pd.set_option('display.max_columns', None)

#显示所有行
# pd.set_option('display.max_rows', None)

#设置value的显示长度为100,默认为50
# pd.set_option('max_colwidth',100)

从代码中可以看出来,选择了6个图形进行组合:

  • 柱状图Bar
  • 饼图Pie
  • 折线图Line
  • 热力图HeatMap
  • 漏斗图Funnel
  • 仪表盘Gauge

另外的GridPage是两个图形组件

模拟数据

柱状图+折线图+饼图是用的一份模拟数据,具体如下:

柱状图

代码语言:javascript
复制
c = (
    Bar()
    .add_xaxis(df['子类'].tolist())
    .add_yaxis("5大开支",df['数据'].tolist())
    .set_global_opts(
        title_opts=opts.TitleOpts(title="Bar-月度开支"),
        legend_opts=opts.LegendOpts(is_show=False),
    )
)

c.render_notebook()

饼图

代码语言:javascript
复制
c = (
    Pie()
    .add("", [list(z) for z in zip(df['子类'].tolist(), df['数据'].tolist())])
    .set_global_opts(title_opts=opts.TitleOpts(title="Pie-月度开支"))
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)

c.render_notebook()

折线图

代码语言:javascript
复制
c = (
    Line()
    .add_xaxis(df['子类'].tolist())
    .add_yaxis("月度开支", df['数据'].tolist())
    .set_global_opts(title_opts=opts.TitleOpts(title="Line-月度开支"))
)

c.render_notebook()

热力图

代码语言:javascript
复制
# 0-50 的随机数+列表推导式

value = [[i, j, random.randint(0, 50)] for i in range(24) for j in range(7)]

c = (
    HeatMap()
    .add_xaxis(Faker.clock)
    .add_yaxis("热力图", Faker.week, value)
    .set_global_opts(
        title_opts=opts.TitleOpts(title="HeatMap-热力图"),
        visualmap_opts=opts.VisualMapOpts(),
    )
)

c.render_notebook()

漏斗图

代码语言:javascript
复制
c = (
    Funnel()
    .add("商品", [list(z) for z in zip(Faker.choose(), Faker.values())])
    .set_global_opts(title_opts=opts.TitleOpts(title="Funnel-漏斗图"))
)

c.render_notebook()

仪表盘

代码语言:javascript
复制
c = (
    Gauge()
    .add("", [("完成率", 80)])
    .set_global_opts(title_opts=opts.TitleOpts(title="Gauge-仪表盘"))
)

c.render_notebook()

Page组合

绘图代码

1、先定义每个图形的函数

2、将所有的绘图方法添加到Page中

3、生成HTML文件

代码语言:javascript
复制
# from pyecharts import options as opts
# from pyecharts.charts import Bar, Pie, Line, HeatMap, Funnel, Gauge, Grid, Page
# from pyecharts.faker import Faker

# 1、柱状图

def barPage() -> Bar:
    bar = (
        Bar()
        .add_xaxis(df['子类'].tolist())
        .add_yaxis("5大开支",df['数据'].tolist())
        .set_global_opts(
            title_opts=opts.TitleOpts(title="Bar-月度开支"),
            legend_opts=opts.LegendOpts(is_show=False),)
    )
    return bar

# 2、饼图

def piePage() -> Pie:
    pie = (
        Pie()
        .add("", [list(z) for z in zip(df['子类'].tolist(), df['数据'].tolist())])
        .set_global_opts(title_opts=opts.TitleOpts(title="Pie-月度开支"))
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
    )
    return pie

# 3、折线图
def linePage() -> Line:
    line = (
        Line()
        .add_xaxis(df['子类'].tolist())
        .add_yaxis("月度开支", df['数据'].tolist())
        .set_global_opts(title_opts=opts.TitleOpts(title="Line-月度开支"))
    )
    return line


# 4、热力图


def heatmapPage() -> HeatMap:
    value = [[i, j, random.randint(0, 50)] for i in range(24) for j in range(7)]
    heatmap = (
        HeatMap()
        .add_xaxis(Faker.clock)
        .add_yaxis("热力图", Faker.week, value)
        .set_global_opts(
            title_opts=opts.TitleOpts(title="HeatMap-热力图"),
            visualmap_opts=opts.VisualMapOpts(),
        )
    )
    return heatmap


# 5、漏斗图
def funnelPage() -> Funnel:
    funnel = (
        Funnel()
        .add("商品", [list(z) for z in zip(Faker.choose(), Faker.values())])
        .set_global_opts(title_opts=opts.TitleOpts(title="Funnel-漏斗图"))
    )
    return funnel


# 6、仪表盘

def gaugePage() -> Gauge:
    gauge = (
        Gauge()
        .add("", [("完成率", 80)])
        .set_global_opts(title_opts=opts.TitleOpts(title="Gauge-仪表盘"))
    )
    return gauge


# 上面是6个图形的代码,下面利用Page进行组合

# !!! 关键步骤:将上面定义的每个函数或者方法添加进来
page = (
    Page()
    .add(
        barPage(),
        piePage(),
        linePage(),
        funnelPage(),
        heatmapPage(),
        gaugePage())
)

page.render("page_demo.html")  # 生成HTML文件
默认方式

上面采用的是Page的默认绘图方式

当我们打开HTML文件会发现所有的图形都是靠左的,为了显示方便图形被缩小了

缺点:页面的右边空白太多了,使得页面显示效果很差

simple-layout

这种方式会将图形全部放在HTML页面的正中间的,代码改变的部分如下:

代码语言:javascript
复制
# 上面的绘图代码相同

####  不同之处

page = (
    Page(layout=Page.SimplePageLayout)   # !!!!改变在这里
    .add(
        barPage(),
        piePage(),
        linePage(),
        funnelPage(),
        heatmapPage(),
        gaugePage())
)

page.render("page_simple_demo.html")  # 生成HTML文件

我们看看实际的效果:

当我们的屏幕不断缩小的时候,所有的图形会排成一行:

缺点:图形居中的话,布局得到了优化,但是图形较多的时候需要不断地向下移动,而且页面上某个图形有时候只是显示部分,显得突兀。

拖拽布局-DraggablePageLayout

这种方式才是Pyecharts的强大之处???。使用这种方式,我们可以得到任何排列和图形大小的布局,代码改变如下:

代码语言:javascript
复制
# 上面的绘图代码相同

####  不同之处

page = (
    Page(layout=Page.DraggablePageLayout)   # !!!!改变在这里
    .add(
        barPage(),
        piePage(),
        linePage(),
        funnelPage(),
        heatmapPage(),
        gaugePage())
)

page.render("page_draggable_demo.html")  # 生成HTML文件

我们先看看生成的图形:

在这种方式下,图形是可以任意拖拽的,同时大小也可以改变的,我们尝试一种排列方式:

重点来了:我们点击左上角的Save Config,会在本地的相同目录下生成一个json的配置文件,然后格式化我们的文件

代码语言:javascript
复制
Page.save_resize_html("page_demo.html",   # 上面的HTML文件名称
                      cfg_file="chart_config.json",  # 保存的json配置文件
                      dest="page_draggable_demo.html")  # 新的文件名称

这个时候我们在运行一下,生成的HTML文件就是我们在上面排版的布局,完美?

保存代码

保存一份关于嵌套圆形图的代码:

代码语言:javascript
复制

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

nine_Giant = nine.drop_duplicates("Giant等级")
one_Giant = one.drop_duplicates("Giant等级")

# 进行排序:饼图中从小到大排序
nine_Giant = nine_Giant[["Giant等级","Giant_per"]].sort_values("Giant等级")
one_Giant = one_Giant[["Giant等级","Giant_per"]].sort_values("Giant等级")



# 内部饼图
inner_names = one_Giant["Giant等级"].tolist()
inner_values = one_Giant["Giant_per"].tolist()
inner_pair = [list(z) for z in zip(inner_names,inner_values)]

# 外部环形(嵌套)
outer_names = nine_Giant["Giant等级"].tolist()
outer_values = nine_Giant["Giant_per"].tolist()
outer_pair = [list(z) for z in zip(outer_names,outer_values)]

c = (
     # 初始化
    Pie(init_opts=opts.InitOpts(
        width="900px", 
        height="800px",
        theme=ThemeType.SHINE))
    
    # 内部饼图
    .add(
        series_name="版本3.2.1",  # 系列名称
        center=["50%", "35%"],
        data_pair=inner_pair,  # 系列数据项,格式为 [(key1, value1), (key2, value2)]
        radius=["25%", "40%"],  #饼图半径 数组的第一项是内半径,第二项是外半径
        #label_opts=opts.LabelOpts(position="inner"), #标签设置在内部
    )
    
    # 外部嵌套环形图
    .add(
        series_name="版本3.2.9",  # 系列名称
        center=["50%", "35%"],
        radius=["40%", "60%"],  #饼图半径 数组的第一项是内半径,第二项是外半径
        data_pair=outer_pair, # 系列数据项,格式为 [(key1, value1), (key2, value2)]
        
        # 标签配置项 参考上面的例子
        label_opts=opts.LabelOpts(
            # position="outside",
            # formatter="{a|{a}}{abg|}\n{hr|}\n {b|{b}: }{c}  {per|{d}%}  ",
            background_color="#eee",
            border_color="#aaa",
            border_width=1,
            border_radius=4,
            rich={
                "a": {"color": "#999",
                      "lineHeight": 22, 
                      "align": "center"},
                
                "abg": {
                    "backgroundColor": "#e3e3e3",
                    "width": "100%",
                    "align": "right",
                    "height": 22,
                    "borderRadius": [4, 4, 0, 0],
                },
               
                
                "hr": {
                    "borderColor": "#aaa",
                    "width": "100%",
                    "borderWidth": 0.5,
                    "height": 0,
                },
                
                
                "b": {"fontSize": 16, "lineHeight": 33},
                
                
                "per": {
                    "color": "#eee",
                    "backgroundColor": "#334455",
                    "padding": [2, 4],
                    "borderRadius": 2,
                },
            },
        ),
    )
    
    # 全局配置项
    .set_global_opts(
        xaxis_opts = opts.AxisOpts(is_show = False),   #隐藏X轴刻度
        yaxis_opts = opts.AxisOpts(is_show = False),    #隐藏Y轴刻度
        legend_opts = opts.LegendOpts(is_show = False),  #隐藏图例
        title_opts = opts.TitleOpts(title = None),    #隐藏标题
                    )
   
    # 系统配置项
    .set_series_opts(
        tooltip_opts=opts.TooltipOpts(
            trigger="item", 
            formatter="{a} <br/>{b}: {c} ({d}%)"
        ),
        label_opts=opts.LabelOpts(is_show=False)  # 隐藏每个触角标签
    )
)

c.render_notebook()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-11-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Pyecharts-14-图形组合
  • 绘制多个图形
    • 导入库
    • 模拟数据
    • 柱状图
    • 饼图
    • 折线图
    • 热力图
    • 漏斗图
    • 仪表盘
    • Page组合
      • 绘图代码
        • 默认方式
          • simple-layout
            • 拖拽布局-DraggablePageLayout
            • 保存代码
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档