pyecharts丨页面布局工具——Page 和 Grid

比如我想达到的效果图是这样:
在这里插入图片描述
就要用到pyecharts中的page和grid布局。其中page帮助我们将多个模块垂直组合到一个页面中,grid帮助我们将多个单元素(图、表、overlap、图片)水平或垂直并列布局

先从相对简单的page说起。

一、 令图表垂直布局——Page

  1. 首先import类
from pyecharts.charts import Page, Grid
  1. 使用时将其实例化。
    需要指出的是,初始化时Page()中是可以指定参数的,比如layoutDraggablePageLayout是令每个模块可以被任意拖动、缩放,便于人工布局;SimplePageLayout是令每个模块自动水平居中对齐。不指定的话,所有模块就会靠左对齐。
page_1 = Page(layout=Page.SimplePageLayout)     
 #page布局   layout=Page.DraggablePageLayout   layout=Page.SimplePageLayout
  1. 往page里面添东西。
grid1_1 = Grid(init_opts=opts.InitOpts(theme=ThemeType.ROMA, width='1600px'))

c1_1 = phone_views.huozan_mi()
c1_2 = phone_views.huozan_honor()
grid1_1.add(c1_1, grid_opts=opts.GridOpts(pos_right="55%"))
grid1_1.add(c1_2, grid_opts=opts.GridOpts(pos_left="55%"))
# 对grid的pos参数而言,pos_left是显示在靠右的位置 pos_right同理

im1 = phone_views.image_mi10_feature()
im2 = phone_views.image_honor_feature()

c_1_3 = phone_views.themeRiver()

# page里可以add多种元素,grid chart image等等。下文将详解
page_1.add(grid1_1)
page_1.add(c_1_3)
page_1.add(im1)
page_1.add(im2)

page相对功能少一些,布局也只是将不同元素无脑怼在一个页面而已,无甚好谈,仅此而已。

如果想让图表平行地列在一起,就要用grid了。

二、 令图表水平布局——Grid

上文在import Page时也顺便把Grid导进来了。。

然后在给page添东西的时候也展示grid怎么添元素了。。

哈哈哈哈好了Grid讲解完了本篇到此结束下篇再见(挥手

#==================================================

。。嗯 其实还是有必要好好说下的,因为grid布局的图形不是添进grid就不用管了,细节还有很多要处理。

grid1_1 = Grid(init_opts=opts.InitOpts(theme=ThemeType.ROMA, width='1600px'))
'''
首先声明时,推荐一定要把width height定下来,
如果你单纯就想将两张图水平/垂直布局,
那你大可指定一个参数即可,另一个就是图形自己的高或宽了;
如果你是要四张图田字堆一起,宽高就都要事先定好,grid可不会给你自适应。
至于那个theme,是pyecharts自带的几种主题风格,感兴趣请看文档或相关文章。
'''
c1_1 = phone_views.huozan_mi()
c1_2 = phone_views.huozan_honor()
# c1_1 c1_2 是两个bar
grid1_1.add(c1_1, grid_opts=opts.GridOpts(pos_right="55%"))
grid1_1.add(c1_2, grid_opts=opts.GridOpts(pos_left="55%"))
# 对grid的pos参数而言,pos_left是显示在靠右的位置 pos_right同理
# 当然这可能也跟后面跟的百分比超过了一半有关。。我没去试验
## 同时,添进去的两个图的标题位置、图例位置,也要进行手动调整

但grid所指定的位置只是单纯的的位置,图的一些属性,比如标题、图例,都还是在原位置。所以添进去的两个图的标题位置、图例位置要在定义函数里进行手动调整。

def huozan_mi():       #z正向微博获赞、转发等数据,柱状
    c1 = (
        Bar(init_opts=opts.InitOpts(theme=ThemeType.ROMA, width='700px'))
            .add_xaxis(["点赞数", "转发数", "评论数"])
            .add_yaxis("mi10_young", [405020, 159455, 160529])
            .add_yaxis("mi10_pro", [131234, 11431, 36922])
            .add_yaxis("redmi_k30_pro", [110892, 7518, 29415], markline_opts=5000)
            .set_global_opts(title_opts=opts.TitleOpts(title="2020小米新品手机正向微博数据", subtitle="各型号获赞、评论、转发数", pos_left='5%'),
                             legend_opts=opts.LegendOpts(pos_left="25%"))
            # 对于图像里的pos参数而言,pos_left是真的靠左位置

    )
    return c1

def huozan_honor():       #z正向微博获赞、转发等数据,柱状
    c1 = (
        Bar(init_opts=opts.InitOpts(theme=ThemeType.ROMA))
            .add_xaxis(["点赞数", "转发数", "评论数"])
            .add_yaxis("honor_x10", [405020, 159455, 160529])
            .add_yaxis("honor_30s", [131234, 11431, 36922])
            .add_yaxis("huawei_nova7", [110892, 7518, 29415], markline_opts=5000)
            .set_global_opts(title_opts=opts.TitleOpts(title="同价位华为手机正向微博数据", subtitle="各型号获赞、评论、转发数", pos_right='7%'),
                             legend_opts=opts.LegendOpts(pos_right="25%"))

    )
    return c1

注意chart定义时的title_optslegend_opts,都设置了相关的pos。

最终效果:
在这里插入图片描述

P.S. 如何让两个饼图平行排列?

答案: 把两个饼图加到grid中之后,在定义饼图时用center参数来控制饼图位置。两个饼图一左一右,就达到了平行的目的。

pie = (Pie(init_opts=opts.InitOpts(theme=ThemeType.ROMA))
           .add('', [list(z) for z in zip(cate_1, data_1)],
                radius=["30%", "50%"],		#控制内外半径,即图的大小
                rosetype="radius",		#表明是玫瑰图,半径跟数值挂钩
                center=["75%", "25%"])		#饼图中心的位置,即整个图的位置。格式:[左右,上下]
                
           .set_global_opts(title_opts=opts.TitleOpts(title="喜欢mi_10_young人群性别", subtitle="有效数据约900人", pos_left='5%'),
            		     legend_opts=opts.LegendOpts(pos_left="35%"))
            
           .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
           )

效果图就不放了,因为我后面换了呈现方式,没有截图了。。但两个饼图平行排列这句话本身不就是显而易见的效果图嘛。

P.P.S. 如何让两张纯图片平行排列?

这就不需要grid了,因为pyecharts中的image类型和chart不一样,Grid布局找不到image的属性。

那就直接从根本上解决问题。image引入时是可以设定绝对位置的,我们直接让两张图在绝对位置上左右排列,并设置到margin,就可以了。


def image_mi10_feature():

    image = Image()
# 如果图片url是本地链接,需要在url.py文件中加一句话
    img_src1 = (
        "../demo/pics/mi10_features.png"
    )

    image.add(
        src=img_src1,
        style_opts={"width": "700px", "height": "500px", "top": "1165px", "left": "47px", "style": "margin-right: 20px"},)

    image.set_global_opts(
        title_opts=ComponentTitleOpts(title="用户关注mi_10_young的哪些方面?", subtitle="基于LDA模型分析")
    )
    return image

def image_honor_feature():

    image = Image()
# 如果图片url是本地链接,需要在url.py文件中加一句话
    img_src = (
        "../demo/pics/honor_features.png"
    )

    image.add(
        src=img_src,
        style_opts={"width": "700px", "height": "500px", "top": "1165px", "right": "50px", "style": "margin-left: 20px"},
    )
    image.set_global_opts(
        title_opts=ComponentTitleOpts(title="用户关注honor_X10的哪些方面?", subtitle="基于LDA模型分析"),
    )
    return image

style_opts中设置。

效果图:
在这里插入图片描述
(没错,这是两张图片,而不是table)

P.P.P.S 如何让两个词云水平排列?

——我也想知道。
pyecharts里的词云我也没搞清楚怎么设置位置或怎么样。。如果有人知道,请留言告诉我,谢谢啦。

目前想到的替代方法,很简单,从其他包画出词云,导出图片,再按照上文方法平行放置。

  • 28
    点赞
  • 201
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
作者Hankkin,源码PageLayoutDemo,一款简单的 page 切换 空布局、错误布局、加载布局,支持一键配置、定义,不需要 xml 编写该功能是支持单独为某个布局设置状态改变的,比如很多同学提到的我一个 listview 的数据没有获取到,fun initPage(targetView: Any),这个 targetView 你只需要设置成你的 listview 或者包裹你 listview 的 parent 布局就 OK 了,具体原理可以看下面的代码解析啊,遍历获取索引,然后记录索引值....项目中我们经常会用到的加载数据,加载完数据后显示内容,如果没有数据显示一个空白页,这是如果网络错误了显示一个网络错误页,自定义一个 PageLayout。绪论Android 中经常使用一个空白页和网络错误页用来提高用户体验,给用户一个较好的感官,如果获取到的数据为空,那么会显示一个空白数据页,如果在获取数据的过程中网络错误了,会显示一个网络异常页,像最近比较火的某东这样,见下图。网上也有一些开源的组件,大部分都是自定义继承某个布局在 xml 中让其作为跟布局,然后将自己的内容布局添加进去,效果也都不错,但是个人总觉得稍微有些麻烦,不是那么灵活,n 多个 xml 布局都去定义,写的心烦,所以有了今天的主角。 思考实现的思路实际上是和上面说的一样,只不过换了一种方式,我们手动获取到 contentView,将它从 DecorView 中移除,然后交给 PageLayout 取管理。当时考虑的时候就是不想在每个 xml 中去写页面切换的布局,那么我们可不可以用 Java 代码去控制?带着下面几个问题一起来看一下。1.自定义一个布局让其作为跟布局2.提供切换加载 loading、空白页 empty、错误页 errror、内容页 content功能3.怎么让其取管理上边的四个页面?4.contentView 怎么添加?5.如果我想切换的跟布局不是个 Activity 或者 Fragment 怎么办?6.因为切换页面状态的功能一般都是一个 APP 统一的,那么可不可以一键配置呢?实现1.代码设计首先我们定义 PageLayout 继承 FrameLayout 或者 LinearLayou 或者其他的布局都可以,然后我们需要提供切换四个布局的功能,当然如果支持自定义就更好了,还有状态布局里面的一些属性,还方便一键配置,所以最后采用了 Builder 模式来创建,使用方式就和 Android 里面的AlertDialog一样,通过 Builder 去构建一个 PageLayout。最后的样子是长这样的:方法注释showLoading()显示 loadingshowError()显示错误布局showEmpty()显示空布局hide()显示内容布局BuildersetLoading()setLoadingText()setError()setDefaultLoadingBlinkText()setEmpty()setLoadingTextColor()setDefaultEmptyText()setDefaultLoadingBlinkColor()setDefaultEmptyTextColor()setDefaultErrorText()setDefaultErrorTextColor()setEmptyDrawable()setErrorDrawable()默认样式PageLayout.Builder(this)                 .initPage(ll_default)                 .setOnRetryListener(object : PageLayout.OnRetryClickListener{                     override fun onRetry() {                         loadData()                     }                 })                 .create()自定义样式PageLayout.Builder(this)                 .initPage(ll_demo)                 .setLoading(R.layout.layout_loading_demo)                 .setEmpty(R.layout.layout_empty_demo,R.id.tv_page_empty_demo)                 .setError(R.layout.layout_error_demo,R.id
pyecharts中的`Page`是用于创建多个图表并在一个页面中展示的类。它可以让你轻松地创建一个包含多个图表的大型可视化仪表板。 使用`Page`类,你可以创建多个图表对象,并将它们添加到一个列表中,然后将该列表传递给`Page`类的构造函数。`Page`类将自动创建一个包含所有图表的HTML页面。 示例代码: ```python from pyecharts.charts import Bar, Line, Pie from pyecharts import options as opts from pyecharts.faker import Faker from pyecharts.globals import ThemeType from pyecharts.commons.utils import JsCode from pyecharts.components import Table from pyecharts.options import ComponentTitleOpts # 创建多个图表对象 bar = Bar() line = Line() pie = Pie() # 添加数据 bar.add_xaxis(Faker.choose()) bar.add_yaxis("A", Faker.values()) line.add_xaxis(Faker.choose()) line.add_yaxis("B", Faker.values()) pie.add("", [list(z) for z in zip(Faker.choose(), Faker.values())]) # 设置全局配置 opts_1 = opts.GlobalOpts(theme=ThemeType.CHALK) opts_2 = opts.GlobalOpts(theme=ThemeType.WALDEN) opts_3 = opts.GlobalOpts(theme=ThemeType.LIGHT) # 创建页面对象,将图表添加到列表中 page = Page(layout=Page.DraggablePageLayout) page.add(bar, line, pie) page.add(bar, line, pie, layout=Page.SimplePageLayout) page.add(bar, line, pie, layout=Page.ScrollPageLayout) page.add(bar, line, pie, layout=Page.MultiplePageLayout) # 渲染HTML页面 page.render("multi_chart.html") ``` 在上面的示例中,我们首先创建了三个图表对象,分别是柱状图、折线图和饼图。然后,我们向这些图表对象添加了一些数据。 接下来,我们创建了三个全局配置选项,分别用于不同的主题设置。然后,我们创建了一个`Page`对象,并将三个图表对象添加到了它的构造函数中。 最后,我们使用`render`方法将页面渲染为HTML文件。在生成的HTML文件中,我们可以看到一个包含三个图表的页面。如果我们在`Page`构造函数中使用不同的布局选项,我们可以得到不同的页面布局效果。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值