用 Pyecharts 制作炫酷的可视化大屏

a3ce855becadb2f233c9fd2e8b539db7.gif

作者 | 俊欣

来源 | 关于数据分析与可视化

前两篇Pyecharts的文章来帮我们简单的梳理了一下可以用Pyecharts来绘制哪些图表之后,本篇文章我们用pyecharts里面的一些组件,将绘制的图表都组合起来

844839395a470312cee46f262cf48960.png

35f12205a10401bf4b0e23376341eaf0.png

首先Grid组件

首先介绍Pyecharts模块当中的Grid组件,使用Grid组件可以很好地将多张图无论是上下组合还是左右组合,都能够很好地拼接起来,我们先来看第一个例子

bar = (
    Bar()
    .add_xaxis(Faker.choose())
    .add_yaxis("商家1", Faker.values())
    .add_yaxis("商家2", Faker.values())
    .set_global_opts(title_opts=opts.TitleOpts(title="直方图"))
)
line = (
    Line()
    .add_xaxis(Faker.choose())
    .add_yaxis("商家1", Faker.values())
    .add_yaxis("商家2", Faker.values())
    .set_global_opts(
        title_opts=opts.TitleOpts(title="折线图", pos_top="48%"),
        legend_opts=opts.LegendOpts(pos_top="48%"),
    )
)


grid = (
    Grid()
    .add(bar, grid_opts=opts.GridOpts(pos_bottom="60%"))
    .add(line, grid_opts=opts.GridOpts(pos_top="50%"))
    .render("水平组合图_test.html")
)

2ce5d3f20c116537ccd538bdd2f710fa.png

我们可以看到两张图表被以上下组合的方式拼接起来,当然除了上下的拼接以外,我们还可以左右来拼接,代码如下

bar = (
    Bar()
    .add_xaxis(Faker.choose())
    .add_yaxis("商家1", Faker.values())
    .add_yaxis("商家2", Faker.values())
    .set_global_opts(title_opts=opts.TitleOpts(title="直方图"),legend_opts=opts.LegendOpts(pos_left="20%"),)
)
line = (
    Line()
    .add_xaxis(Faker.choose())
    .add_yaxis("商家1", Faker.values())
    .add_yaxis("商家2", Faker.values())
    .set_global_opts(
        title_opts=opts.TitleOpts(title="折线图", pos_right="5%"),
        legend_opts=opts.LegendOpts(pos_right="20%"),
    )
)


grid = (
    Grid()
    .add(bar, grid_opts=opts.GridOpts(pos_left="60%"))
    .add(line, grid_opts=opts.GridOpts(pos_right="50%"))
    .render("垂直组合图_test.html")
)

d2449d6ec15fed2bfb72485c17c61aeb.png

可以看到我们无论是想上下拼接还是左右拼接,都可以通过调整参数“pos_left”、“pos_right”、“pos_top”以及“pos_bottom”这几个参数来实现,我们再来看一下下面这个例子,我们也可以将地图和直方图两者拼接起来

bar = (
    Bar()
    .add_xaxis(Faker.choose())
    .add_yaxis("商家1", Faker.values())
    .add_yaxis("商家2", Faker.values())
    .set_global_opts(legend_opts=opts.LegendOpts(pos_left="20%"))
)


map = (
    Map()
    .add("商家1", [list(z) for z in zip(Faker.provinces, Faker.values())], "china")
    .set_global_opts(title_opts=opts.TitleOpts(title="地图-基本示例"))
)


grid = (
    Grid()
    .add(bar, grid_opts=opts.GridOpts(pos_top="50%", pos_right="75%"))
    .add(map, grid_opts=opts.GridOpts(pos_left="60%"))
    .render("地图+直方图.html")
)

ef03facf75a6b9ead464b17596315944.png

c9178bb5b673a3b879ebea9350556105.png

再谈Overlap组件

英文单词“overlap”的意思是重叠,那么放在这里,也就指的是可以将多张图合并成一张,那么该怎么结合才好呢?我们来看一下下面这个例子,我们将直方图和折线图通过overlap组件组合到一起

v1 = Faker.values()
v2 = Faker.values()
v3 = Faker.values()


bar = (
    Bar()
    .add_xaxis(Faker.provinces)
    .add_yaxis("商家A", v1)
    .add_yaxis("商家B", v2)
    .extend_axis(
        yaxis=opts.AxisOpts(
            axislabel_opts=opts.LabelOpts(formatter="{value} 个"), interval=20
        )
    )
    .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    .set_global_opts(
        title_opts=opts.TitleOpts(title="Overlap-bar+line"),
        yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value} 个")),
    )
)


line = Line().add_xaxis(Faker.provinces).add_yaxis("商家C", v3, yaxis_index=1)
bar.overlap(line)
bar.render("直方图+折线图Overlap.html")

c43fdc13368203fce30083cfe9c97434.png

除此之外,我们也可以将散点图和折线图合并在一张图上面,在代码上就只要将直方图的代码替换成散点图的就行,这边也就具体不做演示

00f06929965390cf8988b22fed8af5a9.png

Grid组件 + Overlap组件相结合

我们也可以将上面提高的两个组件结合起来使用,以此来绘制多条Y轴的直方图图表,代码如下

Bar()
    .add_xaxis(x_data)
    .add_yaxis(
        "A",
        [具体相关的数据],
        yaxis_index=0,
        color="#d14a61",
    )
    .add_yaxis(
        "B",
        [具体相关的数据],
        yaxis_index=1,
        color="#5793f3",
    )
    .直方图的全局配置代码....
    
line = (
    Line()
    .add_xaxis(x_data)
    .add_yaxis(
        "C",
        [具体相关的数据],
        yaxis_index=2,
        color="#675bba",
        label_opts=opts.LabelOpts(is_show=False),
    )
)


bar.overlap(line)
grid = Grid()
grid.add(bar, opts.GridOpts(pos_left="5%", pos_right="20%"), is_control_axis_index=True)
grid.render("test.html")

f1897b7a60e494e479f1816292fa6e2c.gif

6e7c041965ae98ea101558388b2397ec.png

分页组件Tab

我们在用Pyecharts绘制了多张图表之后,可以直接Tab组件将多张图表连起来,一页放一张图表,具体看下面的例子和代码,

def bar_datazoom_slider() -> Bar:
    c = (
        Bar()
        .add_xaxis(Faker.days_attrs)
        .add_yaxis("商家A", Faker.days_values)
        .set_global_opts(
            title_opts=opts.TitleOpts(title="Bar-DataZoom(slider-水平)"),
            datazoom_opts=[opts.DataZoomOpts()],
        )
    )
    return c


def line_markpoint() -> Line:
    c = (
        Line()
        .add_xaxis(Faker.choose())
        .add_yaxis(
            "商家A",
            Faker.values(),
            markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="min")]),
        )
        .set_global_opts(title_opts=opts.TitleOpts(title="折线图"))
    )
    return c


def pie_rosetype() -> Pie:
    v = Faker.choose()
    c = (
        Pie()
        .add(
            "",
            [list(z) for z in zip(v, Faker.values())],
            radius=["30%", "75%"],
            center=["25%", "50%"],
            rosetype="radius",
            label_opts=opts.LabelOpts(is_show=False),
        )
        .set_global_opts(title_opts=opts.TitleOpts(title="饼图-玫瑰图示例"))
    )
    return c
    
tab = Tab()
tab.add(bar_datazoom_slider(), "直方图")
tab.add(line_markpoint(), "折线图")
tab.add(pie_rosetype(), "饼图")
tab.render("tab_base.html")

5d4f07626df8ead4c49385d661300d3a.gif

分别将所绘制的三张图表放置在三个页面当中,通过pyecharts库当中的tab串联起来

ada200011dd9b6ae72256ce0e61cf072.png

最后是Page组件

和上面Tab组件不一样的是,Tab组件是一页放一张图表,有几张图表就分成几页,而Page组件则是将绘制完成的多张图表统统放在一张页面里面,代码的改动上面也十分的简单,只要将上面代码的Tab部分改成Page()即可,如下

def bar_datazoom_slider() -> Bar:
    c = (
        Bar()
        .add_xaxis(Faker.days_attrs)
        .add_yaxis("商家A", Faker.days_values)
        .set_global_opts(
            title_opts=opts.TitleOpts(title="Bar-DataZoom(slider-水平)"),
            datazoom_opts=[opts.DataZoomOpts()],
        )
    )
    return c


def line_markpoint() -> Line:
    c = (
        Line()
        .add_xaxis(Faker.choose())
        .add_yaxis(
            "商家A",
            Faker.values(),
            markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="min")]),
        )
        .set_global_opts(title_opts=opts.TitleOpts(title="折线图"))
    )
    return c


def pie_rosetype() -> Pie:
    v = Faker.choose()
    c = (
        Pie()
        .add(
            "",
            [list(z) for z in zip(v, Faker.values())],
            radius=["30%", "75%"],
            center=["25%", "50%"],
            rosetype="radius",
            label_opts=opts.LabelOpts(is_show=False),
        )
        .set_global_opts(title_opts=opts.TitleOpts(title="饼图-玫瑰图示例"))
    )
    return c
    
page = Page(layout=Page.SimplePageLayout)
page.add(
    bar_datazoom_slider(),
    line_markpoint(),
    pie_rosetype(),
)
page.render("page_simple_layout.html")

92da364a939982425a5bbfbb69fdd7c7.gif

上图所示的图表在页面当中是不能被挪动的,在Page()组件当中我们还能够使得图表按照我们所想的那样随意的挪动

## 上面的代码都一样,
page = Page(layout=Page.DraggablePageLayout)
page.add(
    bar_datazoom_slider(),
    line_markpoint(),
    pie_rosetype(),
)
page.render("page_draggable_layout.html")

ade05178bdc16fb4ad09d4870a738a60.gif

f5e723d1ddde01036003d715619130d8.gif

a1c00b13bf6996062343999900320044.png

大会

腾讯、阿里、字节是这么做数据的?

资讯

微软、英伟达联手推出最大语言模型

大赛

API 大赛决赛名单出炉!

技术

ST-GCN 实现人体姿态行为分类

35ba3c011974a5772eab302d50f7b72b.png

分享

ae5f22b28416cf1cf6228f3f8ce1d3c9.png

点收藏

275ac52f3fa38675d2b9be5caf232377.png

点点赞

8cb5d85a4a29e62933bc86b8b866df30.png

点在看

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值