Python可视化工具概览

Python可视化工具概览

简介

在Python的世界里,将你的数据可视化有很多种方法。正因如此才很难抉择究竟用哪一个。这篇文章包括了一些流行的库的样例并且详细说明了如何使用他们创建一个简单的柱状图。我将给出绘制数据的例子采用如下库:

l  Pandas

l  Seaborn

l  ggplot

l  Bokeh

l  pygal

l  Plotly

在例子中,我将使用Pandas来操纵数据并且使用它来可视化数据。在大多数情况下这些工具可以不使用Pandas,但是我认为Pandas与可视化工具的结合非常常见,这是最好的入手的方式。

Matplotlib如何?

Matplotlib是Python可视化工具包的鼻祖。它功能非常强大,但同时也因此带来了复杂度。你可以用matplotlib做任何事情,然而这通常不是很简单。我不会草率地浏览单纯的Matplotlib例子因为很多工具(尤其是Pandas和Seaborn)都是Matplotlib的轻量级封装。如果你想要了解更多关于它的内容,我在我的simple graphing文章中给出了许多例子。

我对于Matplotlib最大的不满在于它需要太多的工作来获得一个合理的可视的图表。在练习其中一些例子的时候,我发现很容易就可以不用很多代码便获得好看的图表。想要一个matplotlib冗长的小例子,请看ggplot的faceting的例子。

方法论

这里是这篇文章的方法论的解释。我确信一旦人们开始阅读这里,他们会指出使用这些工具的更好的方式。我的目标不是在每个例子中创建完全一样的图表。我希望在每个例子中都能用大概相同的时间来探索解决方案,并以大致相同的方式将数据可视化。

在这一过程中,我遇到的最大挑战是格式化x和y轴,并通过提供一些巨大的标签来让数据看起来更加合理。搞清楚每个工具希望数据以怎样的方式格式化也花了许多时间。一旦这些问题解决了,剩下的就相对简单了。

另一点需要注意的是柱状图可能是最简单的图表之一。这些工具允许你给数据绘制更多种类的图表。我的例子重点在于减轻格式化的难度,而不是可视图表的创新性。另外,由于标签的存在,一些绘图占用了大量的空间,所以我擅自将它们去掉了——仅仅是为了让文章长度容易管理。最后,我改变的图片的大小,所以任何不清晰都是尺寸的问题,而不是实际的输出质量不够造成的。-

最后,我实现这些的目的是希望找到工具代替Excel。我认为我的例子在报告、演讲、email或者静态网页上展示起来更具有说明性。如果你希望在实时数据可视化或通过一些其他的机制共享等方面评估这些工具的话,它们可能提供了更多的我们深入研究的功能。

数据集

之前的文章描述了我们将要使用的数据。这些数据集有125行条目,但是我选择仅仅关注最上面的10条来简单化。你可以在这里找到全部的数据。

Pandas

我采用了Pandas的一个dataframe作为所有绘图的起始点。幸运的是,Pandas为我们提供了内建的在matplotlib上一层的绘图能力。我将使用它作为基准。

首先,导入我们的模块并且将数据读入一个dataframe。我们也希望将数据排序并限制到最上边的10个条目。


我们将在我们的例子中使用同样的预定的线。这里是最上边5个条目的样子:


现在,设置我们的显示来使用更好的默认值,并且创建一个柱状图:


这里完成了所有的重活:使用“detail”列创建图表并且显示标题以及去掉图例。

这里是将图片存储为png文件所需的额外的代码。


这里是柱状图的样子(为了使文章长度可控而截取了图片的一部分):


这个基础看起来非常棒。理想的,我希望对y轴做一些格式化,但是这需要对matplotlib有一定的认识。这是一个完美可用的图表,但是单纯使用Pandas完成更多的个性化绘图是不可能的。

Seaborn

Seaborn是一个基于Matplotlib的绘图库。它旨在让默认的数据可视化在视觉上变得更加有吸引力。他也有将非常复杂的绘制工作变得易于创建的能力。它同Pandas也整合地很好。

我的例子中没有让Seaborn显著地区分自己。我喜欢Seaborn的一个原因是它能够提供多种内建的风格,允许你快速地改变调色板来让图表更加美观。然而,Seaborn对这个简单的图表不能做太多改变了。

标准导入模块和读取数据:


我发现我必须显式地利用x_order来设置x轴的条目的顺序。

这一节代码设置了顺序、绘图风格和图柱的颜色:



正如你所看到的,我需要使用matplotlib来旋转x轴的标题所以我可以很好地阅读他们。视觉上,图表看起来很好看。实际上,我希望将y轴的标记格式化,但是除了使用matplotlib中的plt.yticks我没有找到其他的方法。

ggplot

ggplot和Seaborn类似。它同样构建于matplotlib之上,旨在改善matplotlib的可视化的视觉吸引力。不同的是,ggplot是R语言ggplot2的一个端口。由于这个原因,一些ggplot的接口不那么pythonic,但是确实功能强大。

我没有使用过R语言的ggplot,所以学习曲线很陡。然而,我可以看到ggplot的吸引力。ggplot库目前开发活跃,并且我希望它能够继续完善成熟,因为我觉得它可能成为一个真正强大的工具。在我学习过程中我确实花费了许多时间在探索怎样来做事。在阅读了一些代码和谷歌了一些之后,我基本上搞清楚了这些东西。

让我们继续导入我们的数据:


现在我们通过将多条ggplot指令链接起来来构建我们的绘图:


这看起来有些奇怪——尤其是使用print p来画图。然而,我发现这个理解起来还是相对简单的。

如何将文本旋转90度以及如何对x轴的标签排序确实需要一番深入研究。

我发现最酷的特点是scale_y_continous,它可以另标签看起来更好看。

如果你希望存储图像,使用ggsave可以很容易实现:


这里是最终的图像。我知道这看起来太灰了。我可以给它添加颜色但是我没有花时间去这么做。

Bokeh

Bokeh是不同于之前3个库的一个。它不依赖于Matplotlib,并且它主要用于在现代网页浏览器中产生可视化的图形。这意味着它可以同web视图进行交互,所以我的例子就显得相当简单了。

导入模块和数据:


Bokeh的一个不同的方面是我们需要显式地列出希望绘制的数值。


现在我们可以画图了。这段代码可以让浏览器显示包含图表的HTML页面。我可以将它存为一个PNG副本以便于我可以把它用作其他目的。


这里是PNG图像:


正如你所见,图像即美观又干净。我没有找到格式化y轴的更简单的方式。Bokeh有许多功能,只是我在这个例子里没有深入研究。

Pygal

Pygal用于创建svg图表。如果依赖库正确安装了,你也可以将结果存储为PNG文件。svg文件对于制作交互式图表而言非常简单。我也发现利用这个工具可以相当简单地创建具有独特样式并且极具视觉吸引力的图表。

进行我们的模块和数据导入工作:


我们需要创建图表类型并进行一些基本设置:


一个兴趣点在于human_readable,它可以出色地完成数据格式化的工作。

现在我们需要的是在我们的图表中加入数据。这里同Pandas的整合并不十分紧密,但是我发现对这个小数据集来做这个非常容易。如果存在非常多的行时,性能可能是一个问题。


现在将文件渲染成svg与PNG格式的文件:



我认为svg的表示非常美观,同时我也喜欢图表结果能够有一个独特的,美观的风格。我也发现搞清楚我能利用这个工具做什么也是非常简单的。我鼓励你们下载svg文件并且在浏览器中查看这些文件,理解一下这些图像交互的本质。

Plot.ly

Plot.ly的不同在于它是一个数据分析与可视化的在线工具。它拥有强健的API,包括Python的API接口。浏览网页,你将发现许多丰富的,可交互的图像。感谢Plot.ly出色的文档,利用它创建柱状图非常的简单。

你将需要按照文档的说明来设置你的API key。一旦完成了,它便可以无缝地工作。有一个警告是你所做的所有事情都是在网页端完成的,所以你要确定你可以这样做。不过,有一个选项可以保证隐私,所以你需要在那个方面做出控制。

Plot.ly与Pandas能够完美无缝结合。我想说的是,他们对我email所提的问题有求必应。我非常感谢他们及时的回复。

导入模块和数据:


为Ploy.ly调整数据和图表类型。


我也决定增加一些额外的显示信息。


最后,绘制数据。这将打开一个浏览器,并且接受你最后的绘图。我最初没有看到这个,不过你也可以使用py.image.save_as在本地存储一个副本。这确实是一个非常酷的特性。你可以获得一个丰富的交互性的基于web的报告,也可以存储一份本地副本,并将它植入你的文档中。



也请检查一下全交互版本。你可以在他们的网站上看到许多鲁棒的例子。

创造性的绘图功能非常吸引人并且是高度可交互的。由于文档和Python的API,上手工作非常容易,并且我非常喜欢最终得到的结果。

总结

在Python的生态中绘制数据是一个既好又不好的消息。好的方面在于有大量的选项可以选择。不好的方面在于选择太多了。想要发现哪一个适合你依赖于你想要实现的功能。某种程度上,你需要玩弄一番某个工具来决定它是否适合你。我没有看到任何一个全赢或全输的情况。

这里有一些我最终的思考:

l  Pandas做简单的绘图非常的灵巧,但是你需要学习Matplotlib来进行个性化设置。

l  Seaborn可以支持一些更复杂的可视化方案,但是依旧需要Matplotlib的知识来调整。颜色模型是非常好的加分。

l  ggplot期望很高,但是还需要经历“成长的痛苦”。

l  Bokeh是一个鲁棒的工具如果你想要设置你自己的可视化服务器,但是对于简单的场景可能有些功能过度。

l  Pygal是唯独可以产生可交互试svg图像和PNG文件的。然而它不如基于Matplotlib的实现的库更灵活。

l  Plot.ly能够产生最具交互性的图表。你可以在线下存储他们或者创建非常丰富的基于web的可视化图形。

就目前而言,我将继续关注ggplot的开发进度并且当需要交互的时候使用pygal以及Plot.ly。

英文原文:http://pbpython.com/visualization-tools-1.html
译者:LuCima

 


评论

还没有任何评论,你来说两句吧

发表评论

浙ICP备16008686 -
善始者实繁,克终者盖寡