专栏文章 推荐一款 Python 数据可视化神器

狂师 · 2020年05月07日 · 最后由 stevenxu 回复于 2020年05月07日 · 4829 次阅读

1. 前言

在日常工作中,为了更直观的发现数据中隐藏的规律,察觉到变量之间的互动关系,人们常常借助可视化帮助我们更好的给他人解释现象,做到一图胜千文的说明效果。

在 Python 中,常见的数据可视化库有:

  • matplotlib 是最常见的 2 维库,可以算作可视化的必备技能库,由于 matplotlib 是比较底层的库,api 很多,代码学起来不太容易。

  • seaborn 是建构于 matplotlib 基础上,能满足绝大多数可视化需求。更特殊的需求还是需要学习 matplotlib。

上述两个库都是静态的可视化库,大多数做过前端 Web 开发的同学都用到过 Echarts.js 库,它是一款前端可视化的 JS 库、功能非常之强大。在使用之前,需要导入 js 库到项目中。对于平时用 Python 较多的同学而言,如果每次实现可视化功能 (特别是一些小需求),都需要引用 js 库显然不太方便,于是就在想有没有 Python 与 Echarts 结合的轮子。答案是肯定的,在 Github 中就有一个国人开发的一个 Echarts 与 Python 结合的轮子:Pyecharts,它不仅很好的兼容了 web 项目,而且可以做到可视化的动态效果。

2. Pyecharts 介绍

Pyecharts 是一个用于生成 Echarts 图表的类库。常规的 Echarts 是由百度开源的一个数据可视化 JS 库,主要用于数据可视化。简单来说,Pyecharts 是一款将 python 与 echarts 结合的强大的数据可视化工具。

使用 Pyecharts 可以生成独立的网页,也可以在 flask , Django 中集成使用。

项目介绍:

http://pyecharts.herokuapp.com/

项目源码:

https://github.com/pyecharts/pyecharts

从项目文档介绍可知, pyecharts 目前分为两个大的系列版本:0.5.x 和 v1.x.x。

  • V0.5.x
    支持 Python2.7,3.4+

0.5.x 版本将不再进行维护,文档位于 05x-docs.pyecharts.org

  • V1
    仅支持 Python3.6+

新版本系列将从 v1.0.0 开始,文档位于 pyecharts.org;示例位于 gallery.pyecharts.org

PS: v0.5.x 和 V1 间不兼容,V1 是一个全新的版本。

3. Pyecharts 支持 30+ 种可视化图表

得益于 Echarts 项目,目前 Pyecharts 支持 30+ 种常见图表,如下所示:

  • Bar(柱状图/条形图)
  • Bar3D(3D 柱状图)
  • Boxplot(箱形图)
  • EffectScatter(散点图)
  • Funnel(漏斗图)
  • Gauge(仪表盘)
  • Geo(地理坐标系)
  • Graph(关系图)
  • HeatMap(热力图)
  • Kline(K 线图)
  • Line(折线/面积图)
  • Line3D(3D 折线图)
  • Liquid(水球图)
  • Map(地图)
  • Parallel(平行坐标系)
  • Pie(饼图)
  • Polar(极坐标系)
  • Radar(雷达图)
  • Sankey(桑基图)
  • Scatter(散点图)
  • Scatter3D(3D 散点图)
  • ThemeRiver(主题河流图)
  • WordCloud(词云图)

4. Pyecharts 安装

1、pip 安装

# 安装 v1 以上版本
$ pip install pyecharts -U

# 如果需要安装 0.5.11 版本的开发者,可以使用
# pip install pyecharts==0.5.11

2、源码安装

# v1 以上版本
$ git clone https://github.com/pyecharts/pyecharts.git
# 如果需要安装 0.5.11 版本,请使用 git clone https://github.com/pyecharts/pyecharts.git -b v05x
$ cd pyecharts
$ pip install -r requirements.txt
$ python setup.py install

在使用 pip 安装库时,由于墙的原因,下载时可能会出现断线和速度过慢的问题导致下载失败,所以建议通过豆瓣源或清华镜像来进行下载:

# 豆瓣源下载
pip install -i https://pypi.douban.com/simple pyecharts

# 清华镜像源
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyecharts

PS: 这里要专门说明一下,自从 0.3.2 开始,为了缩减项目本身的体积以及维持 pyecharts 项目的轻量化运行,pyecharts 将不再自带地图 js 文件。如用户需要用到地图图表(Geo、Map),可自行安装对应的地图文件包。

# 通过pip命令进行安装
pip install echarts-countries-pypkg
pip install echarts-china-provinces-pypkg
pip install echarts-china-cities-pypkg

5. Pyecharts 官方示例实战

现在我们来开始正式使用 pycharts,这里我们先直接使用官方的数据,感受一下可视化展示效果。

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

# V1 版本开始支持链式调用
bar = (
    Bar()
    .add_xaxis(["衬衫""毛衣""领带""裤子""风衣""高跟鞋""袜子"])
    .add_yaxis("商家A", [114552710112527105])
    .add_yaxis("商家B", [571341371291456049])
    .set_global_opts(title_opts=opts.TitleOpts(title="某商场销售情况"))
)
bar.render_notebook()

在这里顺便安利一下 jupyter,pyecharts 在 v0.1.9.2 版本开始,在 jupyter 上可以直接调用实例(例如上方直接调用 bar.render_notebook())就可以将图表直接展示出来,非常方便。

如果脚本在非 jupyter 环境运行,图表渲染方法需改为:

bar.render()

默认情况下,pycharts 生成图表为 HTML 格式,也支持生成 png 图片格式,如下:

from snapshot_selenium import snapshot as driver

from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.render import make_snapshot


def bar_chart() -> Bar:
    c = (
        Bar()
        .add_xaxis(["衬衫""毛衣""领带""裤子""风衣""高跟鞋""袜子"])
        .add_yaxis("商家A", [114552710112527105])
        .add_yaxis("商家B", [571341371291456049])
        .reversal_axis()
        .set_series_opts(label_opts=opts.LabelOpts(position="right"))
        .set_global_opts(title_opts=opts.TitleOpts(title="Bar-测试渲染图片"))
    )
    return c

# 需要安装 snapshot-selenium 或者 snapshot-phantomjs
make_snapshot(driver, bar_chart().render(), "bar.png")

6. Pyecharts 几种高频使用的可视化图表

在上面官方示例中的柱状图表我们已经能感受到 pycharts 可视化功能的强大,最后再介始几种日常工作中常用的可视化图表及对应示例。

6.1 Pie 饼状图

from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker

pie = (
    Pie()
    .add("", [list(z) for z in zip(Faker.choose(), Faker.values())])
    .set_colors(["blue""green""yellow""red""pink""orange""purple"])
    .set_global_opts(title_opts=opts.TitleOpts(title="Pie-设置颜色"))
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)

pie.render_notebook()

6.2 仪表盘

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

g = (
    Gauge()
    .add("", [("完成率"66.6)])
    .set_global_opts(title_opts=opts.TitleOpts(title="Gauge-基本示例"))

)
g.render_notebook()

6.3 折线图

import pyecharts.options as opts
from pyecharts.charts import Line
from pyecharts.faker import Faker

c = (
    Line()
    .add_xaxis(Faker.choose())
    .add_yaxis("商家A", Faker.values(), is_smooth=True)
    .add_yaxis("商家B", Faker.values(), is_smooth=True)
    .set_global_opts(title_opts=opts.TitleOpts(title="Line-smooth"))

)
c.render_notebook()

6.4 K 线图

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

data = [
    [2320.26, 2320.26, 2287.3, 2362.94],
    [2300, 2291.3, 2288.26, 2308.38],
    [2295.35, 2346.5, 2295.35, 2345.92],
    [2347.22, 2358.98, 2337.35, 2363.8],
    [2360.75, 2382.48, 2347.89, 2383.76],
    [2383.43, 2385.42, 2371.23, 2391.82],
    [2377.41, 2419.02, 2369.57, 2421.15],
    [2425.92, 2428.15, 2417.58, 2440.38],
    [2411, 2433.13, 2403.3, 2437.42],
    [2432.68, 2334.48, 2427.7, 2441.73],
    [2430.69, 2418.53, 2394.22, 2433.89],
    [2416.62, 2432.4, 2414.4, 2443.03],
    [2441.91, 2421.56, 2418.43, 2444.8],
    [2420.26, 2382.91, 2373.53, 2427.07],
    [2383.49, 2397.18, 2370.61, 2397.94],
    [2378.82, 2325.95, 2309.17, 2378.82],
    [2322.94, 2314.16, 2308.76, 2330.88],
    [2320.62, 2325.82, 2315.01, 2338.78],
    [2313.74, 2293.34, 2289.89, 2340.71],
    [2297.77, 2313.22, 2292.03, 2324.63],
    [2322.32, 2365.59, 2308.92, 2366.16],
    [2364.54, 2359.51, 2330.86, 2369.65],
    [2332.08, 2273.4, 2259.25, 2333.54],
    [2274.81, 2326.31, 2270.1, 2328.14],
    [2333.61, 2347.18, 2321.6, 2351.44],
    [2340.44, 2324.29, 2304.27, 2352.02],
    [2326.42, 2318.61, 2314.59, 2333.67],
    [2314.68, 2310.59, 2296.58, 2320.96],
    [2309.16, 2286.6, 2264.83, 2333.29],
    [2282.17, 2263.97, 2253.25, 2286.33],
    [2255.77, 2270.28, 2253.31, 2276.22],
]


k = (
    Kline()
    .add_xaxis(["2017/7/{}".format(i + 1for i in range(31)])
    .add_yaxis("k线图", data)
    .set_global_opts(
        yaxis_opts=opts.AxisOpts(is_scale=True
),
        xaxis_opts
=opts.AxisOpts(is_scale=True),
        title_opts=opts.TitleOpts(title="K线图-基本示例"),
    )

)
k.render_notebook()

6.5 地图 Map

from pyecharts import options as opts
from pyecharts.charts import Map
from pyecharts.faker import Faker

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

6.6 词云图

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


data = [
    ("生活资源""999"),
    ("供热管理""888"),
    ("供气质量""777"),
    ("生活用水管理""688"),
    ("一次供水问题""588"),
    ("交通运输""516"),
    ("城市交通""515"),
    ("环境保护""483"),
    ("房地产管理""462"),
    ("城乡建设""449"),
    ("社会保障与福利""429"),
    ("社会保障""407"),
    ("文体与教育管理""406"),
    ("公共安全""406"),
    ("公交运输管理""386"),
    ("出租车运营管理""385"),
    ("供热管理""375"),
    ("市容环卫""355"),
    ("自然资源管理""355"),
    ("粉尘污染""335"),
    ("噪声污染""324"),
    ("土地资源管理""304"),
    ("物业服务与管理""304"),
    ("医疗卫生""284"),
    ("粉煤灰污染""284"),
    ("占道""284"),
    ("供热发展""254"),
    ("农村土地规划管理""254"),
    ("生活噪音""253"),
    ("供热单位影响""253"),
    ("城市供电""223"),
    ("房屋质量与安全""223"),
    ("大气污染""223"),
    ("房屋安全""223"),
    ("文化活动""223"),
    ("拆迁管理""223"),
    ("公共设施""223"),
    ("供气质量""223"),
    ("供电管理""223"),
    ("燃气管理""152"),
    ("教育管理""152"),
    ("医疗纠纷""152"),
    ("执法监督""152"),
    ("设备安全""152"),
    ("政务建设""152"),
    ("县区、开发区""152"),
    ("宏观经济""152"),
    ("教育管理""112"),
    ("社会保障""112"),
    ("生活用水管理""112"),
    ("物业服务与管理""112"),
    ("分类列表""112"),
    ("农业生产""112"),
    ("二次供水问题""112"),
    ("城市公共设施""92"),
    ("拆迁政策咨询""92"),
    ("物业服务""92"),
    ("物业管理""92"),
    ("社会保障保险管理""92"),
    ("低保管理""92"),
    ("文娱市场管理""72"),
    ("城市交通秩序管理""72"),
    ("执法争议""72"),
    ("商业烟尘污染""72"),
    ("占道堆放""71"),
    ("地上设施""71"),
    ("水质""71"),
    ("无水""71"),
    ("供热单位影响""71"),
    ("人行道管理""71"),
    ("主网原因""71"),
    ("集中供热""71"),
    ("客运管理""71"),
    ("国有公交(大巴)管理""71"),
    ("工业粉尘污染""71"),
    ("治安案件""71"),
    ("压力容器安全""71"),
    ("身份证管理""71"),
    ("群众健身""41"),
    ("工业排放污染""41"),
    ("破坏森林资源""41"),
    ("市场收费""41"),
    ("生产资金""41"),
    ("生产噪声""41"),
    ("农村低保""41"),
    ("劳动争议""41"),
    ("劳动合同争议""41"),
    ("劳动报酬与福利""41"),
    ("医疗事故""21"),
    ("停供""21"),
    ("基础教育""21"),
    ("职业教育""21"),
    ("物业资质管理""21"),
    ("拆迁补偿""21"),
    ("设施维护""21"),
    ("市场外溢""11"),
    ("占道经营""11"),
    ("树木管理""11"),
    ("农村基础设施""11"),
    ("无水""11"),
    ("供气质量""11"),
    ("停气""11"),
    ("燃气管理""11"),
    ("市容环卫""11"),
    ("新闻传媒""11"),
    ("人才招聘""11"),
    ("市场环境""11"),
    ("行政事业收费""11"),
    ("食品安全与卫生""11"),
    ("城市交通""11"),
    ("房地产开发""11"),
    ("房屋配套问题""11"),
    ("物业服务""11"),
    ("物业管理""11"),
    ("占道""11"),
    ("园林绿化""11"),
    ("户籍管理及身份证""11"),
    ("公交运输管理""11"),
    ("公路(水路)交通""11"),
    ("房屋与图纸不符""11"),
    ("有线电视""11"),
    ("社会治安""11"),
    ("林业资源""11"),
    ("其他行政事业收费""11"),
    ("经营性收费""11"),
    ("食品安全与卫生""11"),
    ("体育活动""11"),
    ("有线电视安装及调试维护""11"),
    ("低保管理""11"),
    ("劳动争议""11"),
    ("社会福利及事务""11"),
    ("一次供水问题""11"),
]


c=(
    WordCloud()
    .add(series_name="热点分析", data_pair=data, word_size_range=[666])
    .set_global_opts(
        title_opts=opts.TitleOpts(
            title="热点分析", title_textstyle_opts=opts.TextStyleOpts(font_size=23)
        ),
        tooltip_opts=opts.TooltipOpts(is_show=True),
    )

)
c.render_notebook()

上述示例仅供参考,大家结合日常工作应用,学会举一反三才是关健,更多 Pychart 示例介绍可见:代码示例

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 4 条回复 时间 点赞

很好,有时间试用下

好屌的工具

关注一下。感谢分享!

之前都是用 echarts,所有的数据都是后端写好接口,前端在去揉和,抽空试试你推荐的这个

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册