0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

功能强大的开源Python绘图库

数据分析与开发 来源:数据分析1480 作者:数据分析1480 2022-11-17 15:05 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

今天给大家分享一篇可视化干货,介绍的是功能强大的开源Python 绘图库Plotly,教你如何用超简单的(甚至只要一行!)代码,绘制出更棒的图表。

我之前一直守着 matplotlib 用的原因,就是为了我学会它复杂的语法,已经“沉没"在里面的几百个小时的时间成本。这也导致我花费了不知多少个深夜,在 StackOverflow 上搜索如何“格式化日期”或“增加第二个Y轴”。

但我们现在有一个更好的选择了 —— 比如易于使用、文档健全、功能强大的开源 Python 绘图库Plotly。今天就带你深入体验下,了解它如何用超简单的(甚至只要一行!)代码,绘制出更棒的图表。

本文中所有代码都已经在 Github 上开源,所有的图表都是可交互的,请使用Jupyter notebook查看 。 (Github 源代码地址:https://github.com/WillKoehrsen/Data-Analysis/blob/master/plotly/Plotly%20Whirlwind%20Introduction.ipynb)

e4e1a25e-662e-11ed-8abf-dac502259ad0.png

(plotly 绘制的范例图表。图片来源:plot.ly)

Plotly 概述

plotly 的 Python 软件包是一个开源的代码库,它基于 plot.js,而后者基于 d3.js。我们实际使用的则是一个对 plotly 进行封装的库,名叫 cufflinks,它能让你更方便地使用 plotly 和 Pandas 数据表协同工作。 *注:Plotly 本身是一个拥有多个不同产品和开源工具集的可视化技术公司。Plotly 的 Python 库是可以免费使用的,在离线模式可以创建数量不限的图表,在线模式因为用到了 Plotly 的共享服务,只能生成并分享 25 张图表。 本文中的所有可视化图表都是在 Jupyter Notebook 中使用离线模式的 plotly + cufflinks 库完成的。在使用pip install cufflinks plotly完成安装后,你可以用下面这样的代码在 Jupyter 里完成导入:

e4f63cd2-662e-11ed-8abf-dac502259ad0.png

单变量分布:柱状图和箱形图

单变量分析图往往是开始数据分析时的标准做法,而柱状图基本上算是单变量分布分析时必备的图表之一(虽然它还有一些不足)。 就拿博客文章点赞总数为例(原始数据见 Github:https://github.com/WillKoehrsen/Data-Analysis/tree/master/medium ),做一个简单的交互式柱状图:

e534925c-662e-11ed-8abf-dac502259ad0.png

(代码中的df是标准的 Pandas dataframe 对象)

e54b3110-662e-11ed-8abf-dac502259ad0.gif

(使用 plotly+cufflinks 创建的交互式柱状图)

对于已经习惯matplotlib的同学,你们只需要多打一个字母(把.plot改成.iplot),就能获得看起来更加美观的交互式图表!点击图片上的元素就能显示出详细信息、随意缩放,还带有(我们接下来会提到的)高亮筛选某些部分等超棒功能。 如果你想绘制堆叠柱状图,也只需要这样:

ea031e48-662e-11ed-8abf-dac502259ad0.png

ea155ec8-662e-11ed-8abf-dac502259ad0.png

对pandas数据表进行简单的处理,并生成条形图:

ea28c13e-662e-11ed-8abf-dac502259ad0.png

ea3990e0-662e-11ed-8abf-dac502259ad0.png

就像上面展示的那样,我们可以将 plotly + cufflinks 和 pandas 的能力整合在一起。比如,我们可以先用.pivot()进行数据透视表分析,然后再生成条形图。 比如统计不同发表渠道中,每篇文章带来的新增粉丝数:

ea60c516-662e-11ed-8abf-dac502259ad0.png

ea8523ac-662e-11ed-8abf-dac502259ad0.gif

交互式图表带来的好处是,我们可以随意探索数据、拆分子项进行分析。箱型图能提供大量的信息,但如果你看不到具体数值,你很可能会错过其中的一大部分!

散点图

散点图是大多数分析的核心内容,它能让我们看出一个变量随着时间推移的变化情况,或是两个(或多个)变量之间的关系变化情况。

时间序列分析

在现实世界中,相当部分的数据都带有时间元素。幸运的是,plotly + cufflinks 天生就带有支持时间序列可视化分析的功能。 以我在“Towards Data Science”网站上发表的文章数据为例,让我们以发布时间为索引构建一个数据集,看看文章热度的变化情况:

eabe9a74-662e-11ed-8abf-dac502259ad0.png

eacd407e-662e-11ed-8abf-dac502259ad0.gif

在上图中,我们用一行代码完成了几件事情:

自动生成美观的时间序列 X 轴

增加第二条 Y 轴,因为两个变量的范围并不一致

把文章标题放在鼠标悬停时显示的标签

为了显示更多数据,我们可以方便地添加文本注释:

ef3a8c84-662e-11ed-8abf-dac502259ad0.png

ef4aad58-662e-11ed-8abf-dac502259ad0.png

(带有文本注释的散点图)

下面的代码中,我们将一个双变量散点图按第三个分类变量进行着色:

efb47fbc-662e-11ed-8abf-dac502259ad0.png

efc71e1a-662e-11ed-8abf-dac502259ad0.png

接下来我们要玩点复杂的:对数坐标轴。我们通过指定 plotly 的布局(layout)参数来实现这一点(关于不同的布局,请参考官方文档 https://plot.ly/python/reference/),同时我们把点的尺寸(size参数)和一个数值变量read_ratio(阅读比例)绑定,数字越大,泡泡的尺寸也越大。

efe96f9c-662e-11ed-8abf-dac502259ad0.png

f00e17e8-662e-11ed-8abf-dac502259ad0.png

如果想要更复杂一些(详见 Github 的源代码),我们甚至可以在一张图里塞进 4 个变量!(然而并不推荐你们真的这么搞)

f026f560-662e-11ed-8abf-dac502259ad0.png

和前面一样,我们可以将 pandas 和 plotly+cufflinks 结合起来,实现许多有用的图表:

f039c294-662e-11ed-8abf-dac502259ad0.png

f056fd46-662e-11ed-8abf-dac502259ad0.png

建议你查看官方文档,或者源代码,里面有更多的范例和函数实例。只需要简单的一两行代码,就可以为你的图表加上文字注释,辅助线,最佳拟合线等有用的元素,并且保持原有的各种交互式功能。

高级绘图功能

接下来,我们要详细介绍几种特殊的图表,平时你可能并不会很经常用到它们,但我保证只要你用好了它们,一定能让人刮目相看。我们要用到 plotly 的figure_factory模块,只需要一行代码,就能生成超棒的图表!

散点图矩阵

假如我们要探索许多不同变量之间的关系,散点图矩阵(也被称为SPLOM)就是个很棒的选择:

f06e8b0a-662e-11ed-8abf-dac502259ad0.png

f07dfd42-662e-11ed-8abf-dac502259ad0.jpg

即使是这样复杂的图形,也是完全可交互的,让我们能更详尽地对数据进行探索。

关系热图

为了体现多个数值变量间的关系,我们可以计算它们的相关性,然后用带标注热度图的形式进行可视化:

f0a35524-662e-11ed-8abf-dac502259ad0.png

f0c172de-662e-11ed-8abf-dac502259ad0.jpg

自定义主题

除了层出不穷的各种图表外,Cufflinks 还提供了许多不同的着色主题,方便你轻松切换各种不同的图表风格。下面两张图分别是“太空”主题和“ggplot”主题:

f0f49e48-662e-11ed-8abf-dac502259ad0.png

f105a40e-662e-11ed-8abf-dac502259ad0.png

此外,还有 3D 图表(曲面和泡泡):

f12e479c-662e-11ed-8abf-dac502259ad0.png

f15b53d6-662e-11ed-8abf-dac502259ad0.png

对有兴趣研究的用户来说,做张饼图也不是什么难事:

f1dd609c-662e-11ed-8abf-dac502259ad0.png

在 Plotly 图表工坊(Plotly Chart Studio)里编辑

当你在 Jupyter Notebook 里生成了这些图表之后,你将会发现图表的右下角出现了一个小小的链接,写着“Export to plot.ly(发布到 plot.ly)”。如果你点击这个链接,你将会跳转到一个“图表工坊”(https://plot.ly/create/)。 在这里,你可以在最终展示之前进一步修改和润色你的图表。可以添加标注,选择某些元素的颜色,把一切都整理清楚,生成一个超棒的图表。之后,你还可以将它发布到网络上,生成一个供其他人查阅的链接。 下面两张图是在图表工坊里制作的:

f1fc216c-662e-11ed-8abf-dac502259ad0.png

f225fe38-662e-11ed-8abf-dac502259ad0.png

讲了这么多,看都看累了吧?然而我们还并没有穷尽这个库的所有功能。限于篇幅,有些更棒的图表和范例,只好请大家访问 plotly 和 cufflinks 的官方文档去一一查看咯。

f24cd9a4-662e-11ed-8abf-dac502259ad0.jpg

(Plotly 交互式地图,显示了美国国内的风力发电场数据。来源:plot.ly)

最后……

关于沉没成本谬误,最糟糕的一点在于,人们往往只能在放弃之前的努力时,才能意识到自己浪费了多少时间。 在选择一款绘图库的时候,你最需要的几个功能有:

快速探索数据所需的一行代码图表

拆分/研究数据所需的交互式元素

当需要时可以深入细节信息的选项

最终展示前能轻易进行定制

从现在看来,要用 Python 语言实现以上功能的最佳选择非 plotly 莫属。它让我们快速生成可视化图表,交互功能使我们更好地理解信息。 我承认,绘图绝对是数据科学工作中最让人享受的部分,而 plotly 能让你更加愉悦地完成这些任务。

f262a888-662e-11ed-8abf-dac502259ad0.png

(用一张图表显示一下用 Python 绘图的愉悦程度随着时间变化。来源 towardsdatascience.com) 2022年是时候升级你的 Python 绘图库了,让自己在数据科学和可视化方面变得更快、更强、更美吧!

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 开源
    +关注

    关注

    3

    文章

    4368

    浏览量

    46464
  • 可视化
    +关注

    关注

    1

    文章

    1365

    浏览量

    22913
  • python
    +关注

    关注

    58

    文章

    4889

    浏览量

    90327

原文标题:功能强大的开源 Python 绘图库

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    PIC24FJ64GB004系列微控制器:功能强大的16位解决方案

    PIC24FJ64GB004系列微控制器:功能强大的16位解决方案 在电子工程师的日常设计工作中,选择一款合适的微控制器至关重要。Microchip的PIC24FJ64GB004系列微控制器为我们
    的头像 发表于 04-08 18:05 1111次阅读

    RZ/G3S Group:一款功能强大的MPU芯片全面解析

    RZ/G3S Group:一款功能强大的MPU芯片全面解析 在如今的电子科技领域,微处理器(MPU)一直都是各类电子设备的核心部件。今天,我们就来深入探讨Renesas推出的RZ/G3S Group
    的头像 发表于 04-01 11:40 232次阅读

    FTDI FT51A:功能强大的8051兼容核心高级MCU

    FTDI FT51A:功能强大的8051兼容核心高级MCU 在电子设计领域,一款性能卓越、功能丰富的微控制器(MCU)往往能为项目带来更多的可能性。FTDI的FT51A就是这样一款值得关注的产品
    的头像 发表于 03-28 13:05 293次阅读

    深入解析DS1557:功能强大的非易失性计时RAM

    深入解析DS1557:功能强大的非易失性计时RAM 在硬件设计领域,一款优秀的计时RAM对于系统的稳定运行和数据存储至关重要。今天,我们就来深入探讨Maxim公司的DS1557,这款4Meg、非易失
    的头像 发表于 03-24 15:20 398次阅读

    SGM41528:一款功能强大的2A、2 - 电芯电池充电器

    SGM41528:一款功能强大的2A、2 - 电芯电池充电器 在电子设备的电源管理领域,一款性能卓越的电池充电器至关重要。今天,我们就来深入了解一下SGM41528这款I2C控制的2A、2 - 电芯
    的头像 发表于 03-23 16:40 384次阅读

    探索LM83:一款功能强大的温度传感器

    探索LM83:一款功能强大的温度传感器 在电子设备的设计和运行过程中,温度监测至关重要。而一款好的温度传感器可以帮助我们精确捕捉温度变化,预防过热等问题,保障设备的稳定运行。今天,我们就来详细探讨
    的头像 发表于 02-26 13:50 326次阅读

    小巧精致,功能强大——MAX8606 Li+线性充电器评测

    小巧精致,功能强大——MAX8606 Li+线性充电器评测 引言 在当今电子设备高度普及的时代,电池充电管理成为了一项关键技术。对于单节Li+电池的充电需求,一款高效、安全且集成度高的充电器至关重要
    的头像 发表于 02-25 16:00 231次阅读

    深入解析 ISOM8600:功能强大的光仿真器开关

    深入解析 ISOM8600:功能强大的光仿真器开关 作为一名电子工程师,在日常工作中我们常常会寻找性能卓越、可靠性高且能满足多样化需求的电子元件。今天,我要和大家详细介绍一款备受关注的产品
    的头像 发表于 01-20 14:30 337次阅读

    DP83843:一款功能强大的以太网物理层芯片

    DP83843:一款功能强大的以太网物理层芯片 在当今的网络通信领域,以太网技术扮演着至关重要的角色。而物理层芯片作为以太网通信的基础,其性能和功能直接影响着整个网络的稳定性和传输效率。今天,我们
    的头像 发表于 01-04 14:50 518次阅读

    LM8323:一款功能强大的移动I/O伴侣芯片解析

    LM8323:一款功能强大的移动I/O伴侣芯片解析 在电子设备的设计中,一款合适的I/O伴侣芯片能极大地提升设备的性能和功能。今天我们就来深入了解一下德州仪器(TI)的LM8323,这是一款专门为
    的头像 发表于 12-24 17:25 1092次阅读

    TriBoard TC3X9:功能强大的评估板深度解析

    TriBoard TC3X9:功能强大的评估板深度解析 在电子设计的领域中,拥有一款功能强大且灵活的评估板对于开发人员来说至关重要。TriBoard TC3X9就是这样一款值得深入研究的评估板,它为
    的头像 发表于 12-19 11:20 947次阅读

    没有专利的opencv-python 版本

    费用于商业产品,仅需保留版权声明); 包含所有核心功能:图片读取/处理、视频读写、绘图、形态学操作、边缘检测(Canny)、阈值分割、轮廓检测等,满足 90%+ 开发场景; 适配 Python 3.13,安装
    发表于 12-13 12:37

    进迭时空 debug upstream | 取之于开源,贡献于开源

    。Debug相关软件项目概览RISC-V调试所涉及的核心开源软件主要包括GDB和OpenOCD。GDB(GNUDebugger)是GNU项目下的功能强大的源码级调
    的头像 发表于 11-17 09:33 5724次阅读
    进迭时空 debug upstream | 取之于<b class='flag-5'>开源</b>,贡献于<b class='flag-5'>开源</b>

    蓝牙云屏:功能强大,性价比之选​

    蓝牙云屏:功能强大,性价比之选​ 在仪器仪表行业,想要在严格控制成本的同时保证设备功能强大,往往是一件两难的事情。要么为了控制成本牺牲功能,导致产品竞争力不足;要么为了丰富功能增加成本
    的头像 发表于 09-25 17:12 733次阅读
    蓝牙云屏:<b class='flag-5'>功能强大</b>,性价比之选​

    C++ 与 Python:树莓派上哪种语言更优?

    Python是树莓派上的首选编程语言,我们的大部分教程都使用它。然而,C++在物联网项目中同样广受欢迎且功能强大。那么,在树莓派项目中选择哪种语言更合适呢?Python因其简洁性、丰富的库和资源而被
    的头像 发表于 07-24 15:32 1131次阅读
    C++ 与 <b class='flag-5'>Python</b>:树莓派上哪种语言更优?