pyecharts的Tab和Legend布局详情

目录
  • 一、布局设计思路
  • 二、操作实践

导言:

读者朋友有时候是不是和我有一样的困惑,用惯了matplotlibseaborn绘制各种各样的小图供自己观察的时候还算得心应手,但是一旦到了要持续的大批量绘制一些图表供非数据分析人员长久观察的时候又觉得吃力,那么有没有一款第三方python模块能够帮我们解决这种困惑呢?答案是肯定的,这就要推荐我们今天的主角——pyecharts。

pyecharts是百度开源的一款第三方绘图模块,结合的python语言的简易性和Echarts的强大绘图特性,可以用python对其调用,输出交互性好,精美乖巧且符合审美的图表,而且还可以轻松的集成到Flask,Django 等主流 Web 框架,方便自己和别人长久可持续观看。

一、布局设计思路

抛开数据谈布局简直有点天荒夜谈,数据长什么样决定了图表的花容月貌,熟稔自己手里的数据才能知自知彼绘制出优美的图表出来,首先看一下我们样例数据长什么样。

上图是我们的数据表,主要包含的字段有id, flight_date,cargo_type,cargo_weight以及cargo_rate, 其中id类似身份识别号,数量大约有400个左右,一个id就是一个主体,flight_date是记录id的时间,单位是日期,cargo_type表示主体承载的货物类别主要有"A;B", "C;D;E"和 "M"三大类,而cargo_weight和cargo_rate分别表示货物的重量和价格,这种类型的数据是不是像极了我们平时遇到的 各个门店里各类商品每天的销售数据。

知道了数据长什么样子后,我们就可以在草稿纸上画一画,比如我希望把cargo_weight和cargo_rate两者随着时间的变化而展现出的优美走位绘制出来,自然而然,flight_date就作为时间线索横梗在下面,cargo_weight和cargo_rate画在横坐标之上的两位舞者,为了区分,可以用柱状图绘制cargo_weight, 用曲线绘制cargo_rate,犹如蛟龙在群峰之间蜿蜒向前,为了区分刻画cargo_weight和cargo_rate两者之间不同数量级,我还需要引入主纵坐标和副纵坐标,用主坐标刻画cargo_weight的度量,用副坐标刻画cargo_rate的度量,有了这些基本要素之后,接下来问题的关键是怎么把id和cargo_type各放恰当的位置?这的确需要动些脑子,考虑到id和cargo_type两者的数量,可以把cargo_type作为Tab标签,而id作为Legend图例,可以让观察者每选定一个主体就能看到这个主体不同cargo_type的历史上cargo_weight和cargo_rate走势情况,而且还可以赋予每一个cargo_type一个主体配置。

二、操作实践

有了蓝图便胸有成竹,下面便是撰写代码实现的时候了

import pandas as pd
import pymysql
import pyecharts
from pyecharts import options as opts
from pyecharts.charts import Bar, Grid, Line, Tab
from pyecharts.globals import ThemeType

con = pymysql.Connect(host='000.00.0.00', user ='***', passwd='******', database='***')
r_sql = "select id, cargo_type, flight_date, cargo_weight, cargo_rate from adm.adm_ifs_rate_order_price order by flight_date asc, voyage desc" #航班订单数据
f_sql = "select concat(flight_no, '-', orac_3airport, '-', dstc_3airport) as id from ods.dm_flt_info where flight_date = date_sub(curdate(), INTERVAL -1 day) order by id asc" #次日航班计划
raw_data = pd.read_sql(con = con, sql = r_sql) #读取运单原数据
flight_id = pd.read_sql(con = con, sql = f_sql )['id'] #读取航班计划
con.close() #关闭链接

flight_cargo = raw_data.query("id == @flight_id[0]") #筛选具体航班

cargo_type = ['A;B', 'C;D;E', 'M']
cargo_ab = flight_cargo.query("cargo_type == @cargo_type[0] ")[["flight_date",  "cargo_weight",  "cargo_rate"]] #筛选某个货物类别
cargo_cde = flight_cargo.query("cargo_type == @cargo_type[1] ")[["flight_date",  "cargo_weight",  "cargo_rate"]] #筛选某个货物类别
cargo_m = flight_cargo.query("cargo_type == @cargo_type[2] ")[["flight_date",  "cargo_weight",  "cargo_rate"]] #筛选某个货物类别

def ab_() -> Grid:
    bar = (
        Bar()
        .add_xaxis(cargo_ab.flight_date.values.tolist())
        .add_yaxis("运量", cargo_ab.cargo_weight.values.tolist(), yaxis_index=0)

        .set_series_opts(
            itemstyle_opts=opts.ItemStyleOpts(
                opacity=0.5,
            )
         )
         .extend_axis(
            yaxis=opts.AxisOpts(
                type_="value",
                name="运价",
                position="right",
                axisline_opts=opts.AxisLineOpts(
                    linestyle_opts=opts.LineStyleOpts(color="#675bba")
                ),
                splitline_opts=opts.SplitLineOpts(
                    is_show=True, linestyle_opts=opts.LineStyleOpts(opacity=0.5)
                ),
            )
        )

        .set_global_opts(
            title_opts = opts.TitleOpts(title = flight_id[0]),
            yaxis_opts=opts.AxisOpts(name="运量"),
            datazoom_opts = opts.DataZoomOpts(),

        )
    )

    line = (
        Line()
        .add_xaxis(cargo_ab.flight_date.values.tolist())
        .add_yaxis("运价", cargo_ab.cargo_rate.values.tolist(),yaxis_index=1
        )
    )

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

def cde_() -> Grid:
    bar = (
        Bar()
        .add_xaxis(cargo_cde.flight_date.values.tolist())
        .add_yaxis("运量", cargo_cde.cargo_weight.values.tolist(), yaxis_index=0)

        .set_series_opts(
            itemstyle_opts=opts.ItemStyleOpts(
                opacity=0.5,
            )
         )
         .extend_axis(
            yaxis=opts.AxisOpts(
                type_="value",
                name="运价",
                position="right",
                axisline_opts=opts.AxisLineOpts(
                    linestyle_opts=opts.LineStyleOpts(color="#675bba")
                ),
                splitline_opts=opts.SplitLineOpts(
                    is_show=True, linestyle_opts=opts.LineStyleOpts(opacity=0.5)
                ),
            )
        )

        .set_global_opts(
            title_opts=opts.TitleOpts(title=flight_id[0]),
            yaxis_opts=opts.AxisOpts(name="运量"),
            datazoom_opts=opts.DataZoomOpts(),
        )
    )

    line = (
        Line()
        .add_xaxis(cargo_cde.flight_date.values.tolist())
        .add_yaxis("运价", cargo_cde.cargo_rate.values.tolist(),yaxis_index=1
        )
    )

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

def m_() -> Grid:
    bar = (
        Bar()
        .add_xaxis(cargo_m.flight_date.values.tolist())
        .add_yaxis("运量", cargo_m.cargo_weight.values.tolist(), yaxis_index=0)

        .set_series_opts(
            itemstyle_opts=opts.ItemStyleOpts(
                opacity=0.5,
            )
         )
         .extend_axis(
            yaxis=opts.AxisOpts(
                type_="value",
                name="运价",
                position="right",
                axisline_opts=opts.AxisLineOpts(
                    linestyle_opts=opts.LineStyleOpts(color="#675bba")
                ),
                splitline_opts=opts.SplitLineOpts(
                    is_show=True, linestyle_opts=opts.LineStyleOpts(opacity=0.5)
                ),
            )
        )

        .set_global_opts(
            title_opts=opts.TitleOpts(title=flight_id[6]),
            yaxis_opts=opts.AxisOpts(name="运量"),
            datazoom_opts=opts.DataZoomOpts(),
        )
    )

    line = (
        Line()
        .add_xaxis(cargo_m.flight_date.values.tolist())
        .add_yaxis("运价", cargo_m.cargo_rate.values.tolist(),yaxis_index=1
        )
    )

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

tab  = Tab()
tab.add(ab_(), "A;B")
tab.add(cde_(), "C;D;E")
tab.add(m_(), "M")
tab.render_notebook()

下面结合效果图对代码做一下简单的解析,整个代码可以分3大块,第一块是连接数据库读取原数据并将数据一分为三,每一份数据为一个独立的货物类别;第二块是各用一个函数实现某类别货物cargo_weight和cargo_rate展示,而每一个函数作为Tab的参数进行调用,这样,每一个类别形成一个Tab,每一个Tab下面刚好有这个id的历史cargo_weight和cargo_rate走势情况,这样做样做的好处,用Tab就可以划分了cargo_type中"A;B", "C;D;E"和 "M"三个类别;最后调用render_notebook函数把所有Tab渲染出来。

结论:

效果图可以看到如果只要画一个id的各类货物的cargo_weight和cargo_rate走势的话,效果还是不错的,然而我们的id数目高达400个,上述方法很难奏效,我们希望让id去替换上图的运量和运价两个图例,形成id簇的图例,最好还可以对图例进行选择或者翻页

到此这篇关于pyecharts的Tab和Legend布局详情的文章就介绍到这了,更多相关Tab和Legend布局内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python用pyecharts画地图实例介绍

    版本pyecharts 分为 v0.5.X 和 v1 两个大版本,v0.5.X 和 v1 间不兼容,v1 是一个全新的版本 v0.5.X支持 Python2.7,3.4+v1仅支持 Python3.6+ 本文使用的是v1详见官方文档 数据来源只是学习方法,数据来源于网络查找 中国地图 from pyecharts.charts import Map import pyecharts.options as opts import os # 中国地图 province_distribution =

  • pyecharts实现数据可视化

    目录 1.概述 2.安装 3.数据可视化代码 3.1柱状图 3.2折线图 3.3饼图 1.概述 pyecharts 是百度开源的,适用于数据可视化的工具,配置灵活,展示图表相对美观,顺滑. 2.安装 python3环境下的安装: pip3 install pyecharts 3.数据可视化代码 3.1 柱状图 from pyecharts import options as opts from pyecharts.charts import Bar from pyecharts.faker im

  • Python Pyecharts绘制象形柱图

    目录 1.准备工作 1.1 导入模块 1.2 部分参数 2.基础象形图 3.自定义图例 3.1 图片图例 3.2 生成象形图 在可视化展示过程中,为了达到更形象的展示效果,我们往往需要自定义一些直观的图例,本期给大家介绍可视化库Pyecharts中的象形柱图,希望对你有所帮助. 1.准备工作 1.1 导入模块 from pyecharts import options as opts from pyecharts.charts import PictorialBar from pyecharts

  • 利用Python pyecharts绘制饼图

    目录 一.pyecharts绘制饼图语法简介 二.绘制普通饼图 三.绘制圆环图 四.绘制饼图-玫瑰图 一.pyecharts绘制饼图语法简介 饼图主要用于表现不同类目的数据在总和中的占比.每个的弧度不是数据量的占比 pie.add()方法的用法 add(name, attr, value, radius=None, center=None, rosetype=None, **kwargs) name->str 图例名称 attr->list 属性名称 value->list 属性所对应的

  • Pyecharts可视化图片渲染的方法详解

    使用 pyecharts 渲染成图片一直是开发者比较关心的功能,pyecharts提供了 selenium.phantomjs 和 pyppeteer 三种方式. 更多介绍可以学习官方文档:https://pyecharts.org/#/zh-cn/render_images 首先需要安装上snapshot-selenium pip install snapshot-selenium -i http://pypi.douban.com/simple --trusted-host pypi.dou

  • Pyecharts 绘制3种常用的图形

    目录 1.上下组合 2.左右组合 3.一轴多图 大家好,今天给大家利用 Pyecharts 绘制上下组合图.左右组合图.一轴多图,好用超经典,分析给大家 1.上下组合 from pyecharts.charts import Bar, Line, Grid from pyecharts import options # 1.准备数据 country = ['巴西', '俄罗斯', '印度', '英国', '西班牙', '伊朗', '德国', '土耳其', '法国'] quezheng = [92

  • pyecharts的Tab和Legend布局详情

    目录 一.布局设计思路 二.操作实践 导言: 读者朋友有时候是不是和我有一样的困惑,用惯了matplotlib和seaborn绘制各种各样的小图供自己观察的时候还算得心应手,但是一旦到了要持续的大批量绘制一些图表供非数据分析人员长久观察的时候又觉得吃力,那么有没有一款第三方python模块能够帮我们解决这种困惑呢?答案是肯定的,这就要推荐我们今天的主角——pyecharts. pyecharts是百度开源的一款第三方绘图模块,结合的python语言的简易性和Echarts的强大绘图特性,可以用p

  • Python可视化Tkinter进阶grid布局详情

    目录 1.grid布局 1.1.pack布局 1.2.grid布局 2.简易Base64装换工具制作 2.1.源码分析 1.grid布局 Tkinter提供了两中布局方式 pack只能逐行添加 grid可以自定义布局 1.1.pack布局 1.2.grid布局 grid是python标准库提供的控件布局工具 column : 设置控件对象显示的列(从0开始) row :设置控件对象显示的行(从0开始) ipadx :设置控件对象左右内边距 ipady : 设置控件对象上下内边距 padx :设置

  • C++解析特殊符号tab和换行符号详情

    目录 前言: 我们经常会遇到一些Linux内核信息需要,比如一个wifi数据,中间是用tab键盘隔开的,然后每一行用换行符进行区分,如下所示的数据 第一位置是:wifi名称 第二个位置是:信号强度 第三个位置是:信号类型2.4Ghz或者5Ghz 第四个位置是:加密类型 第五个类型是:MAC地址 遇到这样的数据,我们比较常见的C函数解析是用while循环去匹配字符串里面的'\t'(tab键),'\n'(换行符号)等,然后用C标准库里面str函数,例如strncpy进行复制或者strstr去查找,类

  • Flutter常用的布局和事件示例详解

    Flutter 项目中常用的布局详情,及封装和使用,快速开发项目. 以及手势事件和滚动事件的使用 Scaffold 导航栏的实现,有些路由页可能会有抽屉菜单(Drawer)以及底部Tab导航菜单等 const Scaffold({ Key key, this.appBar,//标题栏 this.body,//内容 this.floatingActionButton,//悬浮按钮 this.persistentFooterButtons,//底部持久化现实按钮 this.drawer,//侧滑菜单

  • 解决vant中 tab栏遇到的坑 van-tabs

    话不多说,先看下问题描述: 我的需求:(和头条的tab栏类似 ,单击查看头条tab栏) 点击tab栏,下方展示出来当前tab栏下的内容列表(A页面),点击列表进入详情内容(B页面),但是返回(A页面)的时候,需要显示刚才被点击的tab栏高亮显示.(如果tab栏横向有滚动条,那也得让被选中的高亮显示). 所以,大部分人的解决办法就是将当前选中的tab的索引缓存起来,等回到该页面的时候,让被缓存的那个高亮显示出来. 坑的问题在于:van-tabs,里面的v-model默认值是0,但是类型却写着 nu

  • Android实现App中导航Tab栏悬浮的功能

    首先是"饿了么"导航Tab栏悬浮的效果图. 大家可以看到上图中的"分类"."排序"."筛选"会悬浮在app的顶部,状态随着ScrollView(也可能不是ScrollView,在这里姑且把这滑动的UI控件当作ScrollView吧)的滚动而变化.像这种导航Tab栏悬浮的作用相信大家都能体会到,Tab栏不会随着ScrollView等的滚动而被滑出屏幕外,增加了与用户之间的交互性和方便性. 看到上面的效果,相信大家都跃跃欲试了,那

  • Android App仿微信界面切换时Tab图标变色效果的制作方法

    概述 1.概述 学习Android少不了模仿各种app的界面,自从微信6.0问世以后,就觉得微信切换时那个变色的Tab图标屌屌的,今天我就带大家自定义控件,带你变色变得飞起~~ 好了,下面先看下效果图: 清晰度不太好,大家凑合看~~有木有觉得这个颜色弱爆了了的,,,下面我动动手指给你换个颜色: 有没有这个颜色比较妖一点~~~好了~下面开始介绍原理. 2.原理介绍 通过上面的效果图,大家可能也猜到了,我们的图标并非是两张图片,而是一张图,并且目标颜色是可定制的,谁让现在动不动就谈个性化呢. 那么我

  • Android Listview上下拉动刷新tab滑动切换功能

    近期要做一个含有两个tab切换页面,两个页面有公共的描述信息区域,两个tab都是listview,可以向上或向下拉动刷新,在页面中部有一个tab切换区域,向上滑动的时候tab区域到顶部后就不在移动,向下拉又重新回到初始位置,先看一样样式图吧! 整个需求大致如上图所示,其中上拉刷新和下拉刷新没有截图,采用了开源控件PullToRefreshListView来实现这个效果. 1.总体思路,为了简单不想监控很多手势问题,因此投机取巧的采用下面的方式来实现, a.  整个页面是一个listview,公共

  • Android App中制作仿MIUI的Tab切换效果的实例分享

    1.概述 哈,今天给大家带来一个ViewPagerIndicator的制作,相信大家在做tabIndicator的时候,大多数人都用过TabPageIndicator,并且很多知名APP都使用过这个开源的指示器.大家有没有想过如何自己去实现这样的一个指示器,并且代码会有多复杂呢~~~今天,我就带领大家来从无到有的实现这样一个指示器,当然了,不准备一模一样,搞得没有创新似的,再看标题,跟MIUI相关,所以我们准备做一个特性与TabPageIndicator一致的,但是样子和MIUI的Tab一样的~

  • Android Listview多tab上滑悬浮效果

    样例 近期要做一个含有两个tab切换页面,两个页面有公共的描述信息区域,两个tab都是listview,可以向上或向下拉动刷新,在页面中部有一个tab切换区域,向上滑动的时候tab区域到顶部后就不在移动,向下拉又重新回到初始位置,先看一样样式图吧! 整个需求大致如上图所示,其中上拉刷新和下拉刷新没有截图,采用了开源控件PullToRefreshListView来实现这个效果. 实现方式 总体思路,为了简单不想监控很多手势问题,因此投机取巧的采用下面的方式来实现, a. 整个页面是一个listvi

随机推荐