V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Hlianbobo
V2EX  ›  Python

Python 可视化工具库哪款最好用?哪款最不好用?

  •  
  •   Hlianbobo · 2020-08-11 22:48:50 +08:00 · 4998 次点击
    这是一个创建于 1567 天前的主题,其中的信息可能已经有所发展或是发生改变。
    python 可视化工具有很多种比如 matplotlib,pyecharts,哪种最好用,因人而异。但是由于数据分析工作需求有很多共性,因此还是能基于这些共性找出 “最好用” 的 python 工具。哪些库是坑,也可以吐槽一下。例如:有 bug,更新维护慢,对 python 支持不友好,支持图表类型比较少

    请根据:

    1 、代码量:绘制相同图表所需代码量

    2 、图表数量:支持绘制图表的种类(例如是否支持三维绘图、饼图)

    3 、数据格式:接收数据是否需要二次处理

    4 、参考资料:互联网上相关中文文档 / 教程 / 讨论等资料的数量、质量。或存在像动物园,图灵系列那样的优质书籍

    5 、交互:生成的图标是否可以交互

    6 、调整复杂度:对图标进行调整的复杂程度

    来评价。

    如果愿意可以透露一下自己目前用的是哪一款工具,以及最主要的理由。也可以对比一下各个工具的优劣,多谢!
    15 条回复    2020-08-13 13:12:49 +08:00
    troywinter
        1
    troywinter  
       2020-08-12 00:43:22 +08:00
    公司内部使用的话,推荐直接用 superset,可以直接跑 sql
    volvo007
        2
    volvo007  
       2020-08-12 00:45:30 +08:00   ❤️ 4
    我就不排序了,随便写写

    - matplotlib:也许它不是最早的,也不是现在最强大的,但无疑是使用最多最顺手的一个
    文档支持非常好,各种常见图形也都支持。交互不是不可以做,但是交互和动画这一块写起来会麻烦些

    - pyecharts:很适合中国国情。我也不知道为什么,就感觉默认的色彩搭配饱和度相对高,虽然不是大红大绿那种的,但就是感觉有种“中国风”…… 此外还有专门的中国地图支持,这个比较难得。因为是从 js 库过来的,个人感觉调节的细致度相对原生 js 库要少一些,文档支持相对也少一些。但是平时创建一般图形基本还是够了

    - seaborn 等强化 matplotlib 的库:用下来还是觉得 matplotlib 顺手,我宁可自己调一个颜色和其他风格传到 rcParams 里面去

    - plotly: 库是个好库,但是文档支持一言难尽…… api 的部分写得和面条代码一样…… 而且 api 没有跳转到某个例子的链接,所以会出现看完一个命令但不知道会有什么效果的情况……
    功能上很强大,除了常规图,还能绘表(这个很多库没有),还有 和弦图 这种花活。但是写起来其实我觉得不是很友好,因为 api 太碎,就不得不用 `paraA=dict{paraB=dict{paraC=x, paraD=y}, paraE=z}` 这种字典套字典的写法……参数多的时候有点烦(比如绘制一个动画,plotly 那个写法我真没看懂……)
    幸好 3.0 之后,plotly 整合了一个叫 plotly_express 的 第三方的第三方库。这个对于很多常见图,可以直接传递 DataFrame 的**列名** 来绘图,比上面那个字典套字典的方便太多了。不过这个强化包,也是因为文档较少。如果你要画它例子里面没有的东西,那就要花一番功夫了

    - dash: 基于 plotly 的库,更全面,而且后台是 flask,所以甚至可以写个模版搭简单的小网站。同样文档支持相对少,而且要用好 dash (比如缓存和登录验证),还需要 flask 的相关知识,还要额外学习

    - streamlit: 看了下介绍觉得是个非常牛的东西,不过最近刚装上,还没来得及深度使用,就不评论了
    noqwerty
        3
    noqwerty  
       2020-08-12 02:01:44 +08:00
    @volvo007 #2 plotly 的文档是真的烂……看似很全面但是每次都要研究很长时间才能找到想要的内容。很多时候画图真的就是习惯问题,我平时就感觉 seaborn 比 matplotlib 顺手一些,不过绝大多数时间还是用 R 的 ggplot2 画图了
    nightwitch
        4
    nightwitch  
       2020-08-12 08:55:52 +08:00
    简单的图表我使用 facebook 的 visdom.. 功能很有限,但是可以部署成 web 服务,可以远程监控
    xingshu1990
        5
    xingshu1990  
       2020-08-12 09:59:24 +08:00   ❤️ 1
    mar……V2 社区混的不熟,有没有 mark 功能?不管了 先保存到吃灰书签中。
    leiuu
        6
    leiuu  
       2020-08-12 10:14:59 +08:00
    superset 效果不错的。
    python 的话 matplotlib 功能强大。seaborn 的默认图形效果不错。
    aurora1625
        7
    aurora1625  
       2020-08-12 10:32:47 +08:00
    @volvo007 streamlit 并不是绘图的库,而是一个快速的搭建前端可以展示功能的框架。解决了机器学习从业人员不会 HTML 和 JS 的痛点。非常赞的!其他的分析很到位。用 ploytly 的时候也是痛并快乐着。
    tikazyq
        8
    tikazyq  
       2020-08-12 11:08:39 +08:00
    为啥不用 js,echarts 不香么
    Hlianbobo
        9
    Hlianbobo  
    OP
       2020-08-12 13:30:09 +08:00
    @volvo007 谢谢回复。关于“交互不是不可以做,但是交互和动画这一块写起来会麻烦些”-------听说 bokeh 是基于 matplotlib 开发的。也支持交互。你所说的写起来会麻烦些。是不是说的 bokeh 不好用?

    另外:pyecharts 的官网看了看,没有明显的痕迹看出来这是百度官方的项目。如果是私人维护的,会不会有一天 echarts 还在但是 pyecharts 停更了?

    还有评论中提到文档支持的问题。我这方面认知很有限。特此向你请教。很多人都说看书不如看官方文档。但是我看了 pyecharts 的官方文档。示例代码大段大段的都没有注释。尤其是快速入门 示例代码中的一些函数(这些函数因该是 pyecharts 最常用的函数了)没有注释。你也看不出这些函数的作用是什么?不知道是我 python 的知识太薄弱。还是 pyecharts 的文档做的不好。

    你所谓的围挡支持好或不好,主要的衡量依据是什么?可否分享一下?
    volvo007
        10
    volvo007  
       2020-08-12 23:01:50 +08:00
    @Hlianbobo 同样作为初学者,很高兴能帮你避开这个坑

    bokeh 没有提,是因为用它还不如用 plotly,都是基于 js 的前端;但是 plotly 可以搭网站,这个就厉害很多了
    如果你想网站搭得漂亮,还需要一些 flask 搭建网站知识,和一些前端的内容(比如不是 plotly 的部分怎么用 js 让它跑得更炫)

    如果一直在 js 这条路上走下去,可能就会碰到专门的 js 前端绘图库。这类库都是用 js 向后端数据库拿数据,然后将这个数据绘制出来。有百度的 echarts,d3js,阿里的 G2 、G6 、F2 、L7 都是这一类。因为是 js,所以写起来会稍微比 py 多一点,但是麻烦倒是谈不上。
    同样,如果你要玩花的,那就要深入一点源码才能调节出自己想要的样式了

    不过回头看一下,我们光 py 里面就接触到了很多绘图库,再学 js 的话,一口吃不成一个胖子

    所以,我推荐短时间内专供几个通用绘图库。等它们掌握比较熟练之后,再去学别的。

    不要看 matplotlib “老”,这个主要是因为它是仿造 matlab 的设计语言,所以看上去比较“土”
    但是它真的是一个非常好用,能让你学到很多的库。所以强烈建议先熟悉 matplotlib 库,和这个库下面的很多图形上的术语,比如 Figure, Axes, xtick, linestyle, grid, legend 等等。然后你就会发现其他库里面也有类似的元素,这样就可以一通百通了

    关于官方文档,有时候还真有点见仁见智。我猜你和我一样学 py 的时间并不长,也不太习惯看手册。所以对于某些科班出身很简单的手册,对我们来讲就是天书……然而他们只会让你去看手册……

    所以推荐 matplotlib 还有一个原因就是,它的手册非常的好。你看完它的手册,绝大部分的绘图需求应该难不倒你了。
    它给出了很多 demo,如果你遇到想画又不会的,可以去找找
    它的 api 做了详细分类,如前面所说,你可以先确定要修改什么元素,然后按照这个元素的大类去手册里面找,基本很容易就能找到,而且很有可能会有个例子教你怎么用

    你说的 pyecharts 看不懂手册写的啥,就说明这个手册写的不够好……很多函数的功能都要你去猜,这就没意思了。不过这是一个个人项目,维护人数肯定和 matplotlib 这种不能比,也是没办法的事情
    plotly 甚至有商业项目,然而手册是一个大类下面的所有 api 的简单罗列,然而另一个大类肯定有类似的参数,它也不管,就这么重复罗列堆在一起……我是服气的
    Hlianbobo
        11
    Hlianbobo  
    OP
       2020-08-13 03:06:24 +08:00
    @tikazyq js 和 echarts 没法再 python 中直接加载使用吧?
    Hlianbobo
        12
    Hlianbobo  
    OP
       2020-08-13 03:15:04 +08:00
    @volvo007 谢谢回复。受益匪浅。我的学习进度肯定比你慢了。:) 其实我的目的就是想找一个用的人最多,支持 3D 绘图,支持交互的 三方图库,如果有中文网站就更佳了。这样我也可以在书本之外学着别人去阅读官方文档了。按说默认应该学习 matplotlib,毕竟几乎所有 python 数据分析的书都会有一章介绍他的使用方法。我猜测用的人也是最多了。无奈它不支持交互。这一点我也是挺费解的。交互功能对数据分析来说是有利无害的,不明白最流行的图库为什么不支持。另外他官方网站没有中文版。对我难度也大了。

    以上是我为什么倾向 pyecharts 的原因。不过多亏你介绍了 pyecharts 是私人项目。让我需要重新审视需要学哪个了!万一哪天人家不维护了。我就白学了。…………
    volvo007
        13
    volvo007  
       2020-08-13 10:20:34 +08:00   ❤️ 1
    @Hlianbobo matplotlib 绘制的图形是可以交互的,至少鼠标悬停、显示个交叉坐标之类肯定没问题
    https://matplotlib.org/gallery/event_handling/ginput_manual_clabel_sgskip.html#sphx-glr-gallery-event-handling-ginput-manual-clabel-sgskip-py

    不过需要更复杂的交互方式的话,要自己写就比较麻烦了(当然你也可以把这个过程视为造一个轮子)

    js 和 基于 js 的 py 衍生库,只是造好了轮子而已

    个人还是推荐 plotly,python + 交互都能满足,而且能显示表单和能嵌入网页也是很大的优势(可以做到改变图上内容,表单内容跟着变)
    再深入学一下基于 plotly 的 dash,页面上就能多更多的交互元素,比如滑动手柄、下拉菜单这种,而且也能对不同的元素直接在 py 代码里指定 css

    继续扩展,可以顺带学一下 flask 和如何部署 flask 网站。这样一旦有资源,你可以部署好了直接给别人网址,就不用分发打包的客户端了
    再扩展一下,前端要看数,几乎都会涉及到后端数据库取数的问题。你要愿意把这块也捡起来(轻量的用 sqlite,重一点的就用 sqlalchemy 连接别的类型的数据库),全干工程师基本就入门了
    Hlianbobo
        14
    Hlianbobo  
    OP
       2020-08-13 12:37:21 +08:00
    @volvo007 昨天看了一些文章。严格来说 matplotlib 确实可以无所不能。包括交互。因为 bokeh 好像也是在 matplotlib 基础上开发的。只不过 matplotlib 是命令式代码,不是陈述式代码,所以学习成本比较高。我要在 matplotlib 上实现交互,基本上就做了 bokeh 的活。看到网上说 bokeh 的坑也很多,更新速率快,而且不向下兼容。比较可怕。
    但是 plotly 据说也有不少缺点,其中之一就是部分功能收费。另外在知乎上看,plotly 话题也不是很多,豆瓣和京东上能搜索到的书只有一本。担心自学成孤家寡人。不知道你现在主攻哪个图库?
    volvo007
        15
    volvo007  
       2020-08-13 13:12:49 +08:00
    @Hlianbobo 所以 bokeh 我没提了,确实用过一阵

    plotly 比较讨厌的还是 api 比较碎,文档也不太好。熟悉了之后,一般的图都可以实现啊
    国内话题不多可能和这个风格有关,而且目前好像也是全英文的,语言障碍还是有

    这里要提一下,你说的画图,可能是 chart,而不是 graph 吧。chart 就是我们常说的柱状图、散点图这种;而 graph,则是那种比如“树状图”、“知识网络”、“人物关系网” 这种“图”。这种图,可以用阿里的 AntV G2 系列(基于 js )来实现

    我现在搞 plotly 和 dash 就是因为后台是 flask,顺带把 flask 学了。就算以后不画图了,开发个小网站也方便

    知乎上,绘图比较多的还应该是 matplotlib,这个实在用得太多; echart 热门(不是 pyechart )部分也是因为文档好啊,维护到位,而且 js 又是热门语言
    另一方面,plotly 谈论少,也是因为 js 前端就可以搞定了(把数据传给 js function 就行),而且页面还能搞得更炫(用别的 js 库),没必要把绘图交给后端啊。只有像我这种半道出家,只会 py 的,才去学 plotly 这种来维持生活的样子

    最近也开始学 js 了,希望年底了可以做出一点东西来
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1012 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:29 · PVG 05:29 · LAX 13:29 · JFK 16:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.