专栏首页MeteoAI还在用matplotlib画图?你out啦

还在用matplotlib画图?你out啦

概述

进行数据处理的时候,可视化是非常重要的数据分析方式,但是有时候在处理大批量的数据时,由于数据量过多,数据往往会非常密集,而不能发现有效信息,而我们经常使用的matplotlib不能满足这样的需求,这就需要交互式的可视化方案,提供比较方便和快捷的数据可视化操作。前几天在处理数据的时候,需要实现数据可以滑动或者选择查看,就发现了几个python实现交互式可视化的库,跟大家分享一下。 首先简单介绍一下python的可视化的分类。在Python语言环境里,有不少可视化解决方案,主要的可以大致分为几类:

•基于maplotlib的可视化库,例如经常使用的matplotlib,seaborn以及pandas和scikit-plot的绘图•基于JavaScript的可视化库,例如broken,plotly(DASH)以及pyecharts等库,可以实现交互式的可视化操作•基于上述两者或其他组合功能的库,例如holoviews可以和Seaborn,pandas或者broken组合使用下图是Jake VanderPlas在2017年对python可视化解决方案的总结,有些新的包没有包含,可以作为参考

图片来源于https://speakerdeck.com/jakevdp/pythons-visualization-landscape-pycon-2017

我在解决python交互式的可视化问题时,主要用到的是基于JavaScript的可视化库pyecharts。pyecharts 是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库。用 Echarts 生成的图可视化效果非常棒,pyecharts 是为了与 Python 进行对接,方便在 Python 中直接使用数据生成图。使用pyecharts可以生成独立的网页,也可以在flask、django中集成使用 ,此外也可以直接利用render_notebook,直接在jupyter notebook里调用渲染。

pyecharts的安装

pyecharts 分为 v0.5.X 和 v1 两个大版本,v0.5.X 和 v1 间不兼容,v1 是一个全新的版本。其中v0.5.X支持python2.7和3.4+,未来不再进行维护,v1仅支持python3.6+,是以后版本迭代的基础。 安装利用pip,利用conda安装没有成功

$ pip install pyecharts

或源码安装

$ git clone https://github.com/pyecharts/pyecharts.git
$ cd pyecharts
$ pip install -r requirements.txt
$ python setup.py install
# 或者执行 python install.py

常用的图表

一个简单的例子

from pyecharts.charts import Bar

bar = Bar()
bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
bar.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
bar.add_yaxis("商家B", [8, 15, 49, 15, 65, 80])
bar.render('bar.html')

render 会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件吗,也可以传入路径参数,如 bar.render("bar.html"),此外如果使用的是juypter notebook 可以直接reader_notebook在jupyter里面渲染。打开html文件:

这是两个商家不同衣服销量对比的柱状图,可以查看数值的详细信息,以及对不同的项目进行选择。 接下来参考官方的示例,对常用的图表进行简单示范:

柱状图

柱状图可以进行对比分析,数据是对于不同地级市的观测和预报数据,由于数据太多,单独画在一个图片中,将会非常拥挤,无法清晰看出差距,就需要借助于交互式的图像方案:

from pyecharts import options as opts
from pyecharts.charts import Bar
def bar_test(df) -> Bar:
    c = (
        Bar()
        .add_xaxis(df.index.tolist())
        .add_yaxis("观测", df['气温观测'].tolist(),category_gap="10%", gap="5%")
        .add_yaxis("预报", df['气温预测'].tolist(), category_gap="10%", gap="5%")
        .set_global_opts(
            title_opts=opts.TitleOpts(title="地级市气温观测与预报分析"),
            toolbox_opts=opts.ToolboxOpts(),#添加右上角的工具选项
            yaxis_opts=opts.AxisOpts(name="气温"),
            xaxis_opts=opts.AxisOpts(name="城市"),
            datazoom_opts=[opts.DataZoomOpts(),opts.DataZoomOpts(orient="vertical"), opts.DataZoomOpts(type_="inside")]#增添x,y轴以及内部的缩放
        )
       .set_series_opts(
        label_opts=opts.LabelOpts(is_show=False),
        markline_opts=opts.MarkLineOpts(
            data=[
                opts.MarkLineItem(type_="min", name="最小值"),
                opts.MarkLineItem(type_="max", name="最大值"),
                opts.MarkLineItem(type_="average", name="平均值"),
            ]
        ),#添加标示线
        markpoint_opts=opts.MarkPointOpts(
                data=[
                    opts.MarkPointItem(type_="max", name="最大值"),
                    opts.MarkPointItem(type_="min", name="最小值"),
                    opts.MarkPointItem(type_="average", name="平均值"),
                ]
            )
       )#添加标示点
    )
    return c
c=bar_datazoom_slider_vertical(data)
c.render_notebook()

选择不同的数据

选择不同的范围

对于不同地级市观测和预报的气温进行对比画图,在图中我们可以选择观测或者预报数据,缩小x范围,查看局部的差异,或者选定y轴范围,查看不同温度范围的数值分布,右上角的工具可以提供图像的放大和存储以及原始数据的查看。

#堆叠柱状图
def bar_datazoom_slider_vertical(df) -> Bar:
    c = (
        Bar()
        .add_xaxis(df.index.tolist())
        .add_yaxis("3月", df['3月份降水观测'].tolist(),category_gap="10%", gap="5%", stack="stack1")
        .add_yaxis("4月", df['4月份降水观测'].tolist(), category_gap="10%", gap="5%", stack="stack1")
        .add_yaxis("5月", df['5月份降水观测'].tolist(), category_gap="10%", gap="5%", stack="stack1")
        .set_global_opts(
            title_opts=opts.TitleOpts(title="地级市降水春季分析"),
            toolbox_opts=opts.ToolboxOpts(),
            yaxis_opts=opts.AxisOpts(name="降水"),
            xaxis_opts=opts.AxisOpts(name="城市"),
            datazoom_opts=[opts.DataZoomOpts(),opts.DataZoomOpts(orient="vertical"), opts.DataZoomOpts(type_="inside")]
        )
       .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    )
    return c
c=bar_datazoom_slider_vertical(data.iloc)
c.render_notebook()

选择不同的月份

查看局部的数据

图中是3,4,5三个月的降水累计分布图,可以选择不同的月份,查看局部的分布或者特定降水范围的数据

箱式图

箱式图可以查看两个数据的统计属性是否一致,包括均值,最值,中值等

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


def boxpolt_base() -> Boxplot:
    v1 = [
        [850, 740, 900, 1070, 930, 850, 950, 980, 980, 880]
        + [1000, 980, 930, 650, 760, 810, 1000, 1000, 960, 960],
        [960, 940, 960, 940, 880, 800, 850, 880, 900]
        + [840, 830, 790, 810, 880, 880, 830, 800, 790, 760, 800],
    ]
    v2 = [
        [890, 810, 810, 820, 800, 770, 760, 740, 750, 760]
        + [910, 920, 890, 860, 880, 720, 840, 850, 850, 780],
        [890, 840, 780, 810, 760, 810, 790, 810, 820, 850, 870]
        + [870, 810, 740, 810, 940, 950, 800, 810, 870],
    ]
    c = Boxplot()
    c.add_xaxis(["expr1", "expr2"]).add_yaxis("A", c.prepare_data(v1)).add_yaxis(
        "B", c.prepare_data(v2)
    ).set_global_opts(title_opts=opts.TitleOpts(title="BoxPlot-基本示例"))
    return c
c=boxpolt_base()
c.render_notebook()

从图中可以清晰看到每个统计属性

折线图

from pyecharts import options as opts
from pyecharts.charts import Line
def line_test(df) -> Line:
    c = (
        Line()
        .add_xaxis(df.index.tolist())
        .add_yaxis("观测", df['气温观测'].tolist(),linestyle_opts=opts.LineStyleOpts(color="k", width=2))
        .add_yaxis("预报", df['气温预测'].tolist(),linestyle_opts=opts.LineStyleOpts(color="red", width=2))
        .set_global_opts(
            title_opts=opts.TitleOpts(title="地级市气温观测与预报分析"),
            toolbox_opts=opts.ToolboxOpts(),
            yaxis_opts=opts.AxisOpts(name="气温"),
            xaxis_opts=opts.AxisOpts(name="城市"),
            datazoom_opts=[opts.DataZoomOpts(),opts.DataZoomOpts(orient="vertical"), opts.DataZoomOpts(type_="inside")]
        )
       .set_series_opts(
        label_opts=opts.LabelOpts(is_show=False),
        markline_opts=opts.MarkLineOpts(
            data=[
                opts.MarkLineItem(type_="min", name="最小值"),
                opts.MarkLineItem(type_="max", name="最大值"),
                opts.MarkLineItem(type_="average", name="平均值"),
            ]
        ),
        markpoint_opts=opts.MarkPointOpts(
                data=[
                    opts.MarkPointItem(type_="max", name="最大值"),
                    opts.MarkPointItem(type_="min", name="最小值"),
                    opts.MarkPointItem(type_="average", name="平均值"),
                ]
            )
       )
    )
    return c
c=line_test(data)
c.render_notebook()

滑动x轴查看局部信息

滑动y轴查看不同的取值范围

图中是不同地级市观测与预报数据的折线图,可以通过滑动x轴查看局部的趋势和数值,设定y轴,查看特定温度范围的数据

散点图

散点图可以查看分布的趋势

# 散点图
from pyecharts import options as opts
from pyecharts.charts import Scatter
def scatter_visualmap_color(df) -> Scatter:
    c = (
        Scatter()
        .add_xaxis(df.index.tolist())
        .add_yaxis("观测", df['降水观测'].tolist())
        .add_yaxis("预报", df['降水预测'].tolist())
        .set_global_opts(
            title_opts=opts.TitleOpts(title="Scatter-VisualMap(Size)"),
            visualmap_opts=opts.VisualMapOpts(type_="size", max_=150, min_=20),
        )
    )
    return c
c=scatter_visualmap_color(data.iloc[::20])
c.render_notebook()

大小可调节的散点图

图中是不同地级市,观测与预报气温的散点图,大小表示气温的高低,通过左方的调节bar,可以选择一定范围的气温,进行查看分布

热力图

import random

from example.commons import  Faker
from pyecharts import options as opts
from pyecharts.charts import HeatMap

def heatmap_base() -> HeatMap:
    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("series0", Faker.week, value)
        .set_global_opts(
            title_opts=opts.TitleOpts(title="HeatMap-基本示例"),
            visualmap_opts=opts.VisualMapOpts(),
        )
    )
    return c
c=heatmap_base()
c.render_notebook()

热力图

由于我的样例数据没有提供相关的信息,就借用官方的示例数据进行简单展示,可以应用于数据缺失或频率的一个展示

官方其他示例

地理区划图

地理线图

3D展示

本文分享自微信公众号 - MeteoAI(meteoai),作者:Young

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 从wrfout 提取站点数据

    数据准备是机器学习的基础,俗话说巧妇难为无米之炊,没有数据的机器学习就是耍流氓。

    zhangqibot
  • Grib格式数据处理

    上次我们说到了如何使用Python处理NetCDF格式文件,这次我们说一下如何使用python处理grib格式数据。

    zhangqibot
  • 科研动态 | 强冰雹和短时强降水天气雷达特征及临近预警

    湖北省人工影响天气中心李德俊高级工程师近年来专注研究云降水物理、人工影响天气等关键技术问题。针对山区冰雹、短时强降水等强对流天气频发,为了有效防灾减灾,采用多种...

    zhangqibot
  • 使用Pyecharts对猫眼电影票房可视化分析

    我又来了!上次做了个猫眼电影的不过瘾,又感觉票房其实是最好拿到的数据,所以就继续接着它做了。废话不多说,直接上干货!

    Python知识大全
  • 【武汉加油⛽️】基于Pyecharts的疫情数据可视化~

    ?本文使用的数据源来自https://lab.isaaclin.cn/nCoV/zh;

    Awesome_Tang
  • 【Python可视化】使用Pyecharts进行奥运会可视化分析~

    项目全部代码 & 数据集都可以访问我的KLab --【Pyecharts】奥运会数据集可视化分析~获取,点击Fork即可~

    Awesome_Tang
  • Flask 扫盲系列-权限设置

    在前面的学习中,我们设置了系统的注册和登陆功能,已经基本满足了一个小型 Web 应用的需求。那么如果我们想通过这个网站来赚些小钱呢,就需要提供更高级的功能,当然...

    周萝卜
  • 用 Python 制作地球仪的方法

    Python 功能真的很强,强大到让人吃惊,它能做的事囊括爬虫、数据分析、数据可视化、游戏等等各方面,这些功能在实际的使用中应用广泛,开发程序讲究页面的美观与炫...

    砸漏
  • Python3--监控疫情

    from pyecharts.charts import Map, Geo

    用户2337871
  • 用Pyecharts对疫情数据进行可视化分析

    本文使用的数据源来自https://lab.isaaclin.cn/nCoV/zh

    用户3577892

扫码关注云+社区

领取腾讯云代金券