Python的可视化工具概述
概述并比较Python数据可视化包和工具,包括Pandas,Seaborn,ggplot,Bokeh,pygal,和Plotly。
作者Chris Moffitt.发表于kdnuggets.
介绍
在Python世界中,有大量数据可视化的选项.因为各种各样,要知道什么时候使用哪个是非常困难的.本文包含一些较为流行的样例,并说明如果使用其创建简单的条形图.我会使用以下包/工具创建绘图例子:
在例子用,我将使用pandas操作数据,并启动其可视化.在大多数情况下使用这些工具不需要pandas,但是我觉得pandas+可视化工具如此普遍,这是最好的起点.
Matplotlib怎么样?
Matplotlib 是python可视化库的祖父.它非常强大,但是太过复杂.你可以使用Matplotlib 做任何你需要做到的事情,但是并不容易弄明白.我不打算通过纯Matplotlib 样例讲解,因为许多工具(尤其Pandas和Seaborn)是Matplotlib的thin wrappers.
对Matplotlib最大的抱怨是需要大量工作的到期望的图表.在处理这些例子时,我发现更容易获得优美的图形,不需要大量大代码.对于matplotlib冗余性的一个小例子,看一下这个ggplot后例子。
方法
我相信,只要人们开始阅读这一点,他们会指出更好的方式来使用这些工具。我的目标不是建立在每个例子完全相同的图形.我想在搜索解决方案大致相同的时间以大致相同的方式可视化数据.
按这个过程,最大的挑战是格式化x和y轴,使得在给定一些大标签时数据看起来合理.也许花一些时间弄清楚每个工具希望数据如何格式化.一旦弄明白这些部分,剩下的部分比较简单的.
另外一个需要考虑的电视,条形图可能是制作图标类型最简单的一种.这些工具让你能够绘制更多类型的图标.我的示例更注重于易格式化性而不是创新可视化例子,因为标签,一些图表占用了很大空间,所以我削减了,只是为了保证文章的长度管理.最后我调整了图像,因此任何模糊是缩放问题,并且不是实际输出质量.
最后,我接近使用其他工具替换Excel的心态.我认为我的例子更能说明报告,演讲,邮件或者静态网页中的展示.如果你评估实时数据可视化或者通过其他机制共享的工具,那么部分工具提供了很多我没有提到的功能.
数据集
在上篇文章中介绍了我们将要处理的数据.数据集中包含125行项目,但我选择关注前10以保证简单点.你可以在这找到完整的数据.
Pandas
我使用pandas DataFrame作为所有各种图标的出发点.幸运的是,pandas为我们提供了内置的matplotlib层绘图能力.将使用它作为基准.首先,导入模块,并将数据读入DataFrame.我们希望对数据进行排序,并限制为前10项.
budget = pd.read_csv("mn-budget-detail-2014.csv")
budget = budget.sort('amount',ascending=False)[:10]
对所有例子我们使用同样的budget.以下是前5项目样子:
现在,设置展示使用更好的默认值,并创建一个条形图:
pd.options.display.mpl_style = 'default'
budget_plot = budget.plot(kind="bar",x=budget["detail"],
title="MN Capital Budget - 2014",
legend=False)
使用detail列创建图标同时展示标题并区属图例.这是将图片存为png的额外代码.
fig = budget_plot.get_figure()
fig.savefig("2014-mn-capital-budget.png")
这是图片样子(阶段是为了文章长度管理).
看起来基本不错.理想情况下,我想多做一些y轴的格式化,但需要matplotlib 的处理.这是个完美有用的可视化,但是不能通过pandas做更多纯粹的定制.
Seaborn
Seaborn是一个基于matplotlib的可视化库.旨在让默认的数据可视化更加悦目.同时让复杂的图表更简单的创建.它和pandas集成.我的例子不允许Seaborn 显著差异.我喜欢Seaborn 的一个原因是各种各样的内置样式,让你快速更改调色板以看起来更加漂亮.因此,关于简单的图表Seaborn没有为我们做很多. 标准导入并读入数据:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
budget = pd.read_csv("mn-budget-detail-2014.csv")
budget = budget.sort('amount',ascending=False)[:>10]
使用x_order对x轴项目排序.这部分代码设置排序,图表风格和条形图颜色:
sns.set_style("darkgrid")
bar_plot = sns.barplot(x=budget["detail"],y=budget["amount"],
palette="muted",
x_order=budget["detail"].tolist())
plt.xticks(rotation=>90)
plt.show()
如你所见,为了阅读我不得不使用matplotlib旋转x轴标题.从外观上来看,显示非常不错.理想情况下,我想格式化y轴刻度,但是在不引入matplotlib的plt.yticks的情况下,我不知道如果做到这一点.
ggplot
ggplot类似于Seaborn,构建于matplotlib,并且旨在以简单的方式提高matplotlib可视化的视觉吸引力.和Seaborn不同的是它是R中ggplot2的接口.鉴于这个目标,部分API不是python,但非常强大.我没有用过R中的ggplot,所以有一个学习曲线.然后我可以开到ggplot的吸引力.此库正在积极的发展,我希望它继续发展并成熟起来,因为我认为这可能是一个非常强大的功能.为了弄清楚一些事情我也学习过几次.在看代码和做了一些google之后,我能明白大部分.来吧,导入模块,读取数据:
import pandas as pd
from ggplot import *
budget = pd.read_csv("mn-budget-detail-2014.csv")
budget = budget.sort('amount',ascending=False)[:>10]
现在我们通过串联一些ggplot命令创建我们的图表:
p = ggplot(budget, aes(x="detail",y="amount")) + \
geom_bar(stat="bar", labels=budget["detail"].tolist()) +\
ggtitle("MN Capital Budget - 2014") + \
xlab("Spending Detail") + \
ylab("Amount") + scale_y_continuous(labels='millions') + \
theme(axis_text_x=element_text(angle=>90))
print p
这似乎有些奇怪,尤其适用print p来展示图表.然而,弄清楚这点比较简单.在进一步深入后,了解如何旋转文本90度以及如何排序x轴标签.我发现最棒的功能是 scale_y_continous,使得标签好看很多.如果你想保存图片,使用ggsave :
ggsave(p, "mn-budget-capital-ggplot.png")
这是最终图像.我知道有很多灰阶.我可以上色,但是没有时间.
Bokeh
Bokeh和之前3个库都不一样,不依赖与matplotlib,并且面向现代网页浏览器生成可视化.它的目的是让交互式网页可视化,所以我的例子非常简单.导入模块,读取数据:
import pandas as pd
from bokeh.charts import Bar
budget = pd.read_csv("mn-budget-detail-2014.csv")
budget = budget.sort('amount',ascending=False)[:>10]
Bokeh一个不同的方面是,我需要明确列出我们想要绘制的值.
details = budget["detail"].values.tolist()
amount = >list(budget["amount"].astype(>float).values)
现在我们可以绘制.这个代码会让浏览器展示包含图表的HTML网页.如果有其他用途,我可以保存为png副本.
bar = Bar(amount, details, filename="bar.html")
bar.title("MN Capital Budget - 2014").xlabel("Detail").ylabel("Amount")
bar.show()
这是png图片:
正如你所看到的,图片非常干净.我没有找到更简单的方法,更容易的格式化y轴.Bokeh有去许多功能但是我没有在这个例子中深入.
Pygal
Pygal用于创建svg图表.如果安装了正确依赖,同样可以保存为png文件.对于易制作交互式图标svg文件是相当有用的.我同样发现创建独特外观和视觉吸引力的图标非常容易.和之前一样,导入模块,并读取数据:
import pandas as pd
import pygal
from pygal.style import LightStyle
budget = pd.read_csv("mn-budget-detail-2014.csv")
budget = budget.sort('amount',ascending=False)[:>10]
我们需要创建图标类型和设置一些基本属性:
bar_chart = pygal.Bar(style=LightStyle, width=>800, height=>600,
legend_at_bottom=True, human_readable=True,
title='MN Capital Budget - 2014')
值得注意的一点是human_readable,对于格式化数据做的非常好.现在我们需要加入数据到图表中.这里和pandas整合不那么紧密,但是我发现直接处理这个小数据集.当有大量的行,性能可能是一个问题.
for index, row >in budget.iterrows():
bar_chart.add(row["detail"], row["amount"])
现在渲染文件为svg 和png文件:
bar_chart.render_to_file('budget.svg')
bar_chart.render_to_png('budget.png')
我认为svg表现非常好,我喜欢结果图具有独特,赏心悦目的风格.我同样发现很容易弄清楚可以做什么,不可以做什么.我鼓励你下载svg文件,看看在你浏览器中图片的互动性.
Plot.ly
Plot.ly以分析和可视化的在线工具来区分的.有强大的API并且包含python的.浏览网站,你可以发现有非常丰富,交互式的图片.得益于优秀的文档,创建条形图相当简单.你需要遵循文档,获取你API 密钥设置.一旦你这样做,所有工作看上去相当完美.一个需要注意的是,你所做的一切都在网上发布,因此确保你对这点感到OK.有一个选项可以让图表私有,所以你需要设置.Plot.ly和pandas无缝整合.设置导入模块,读取数据:
import plotly.plotly as py
import pandas as pd
from plotly.graph_objs import *
budget=pd.read_csv(“mn-budget-detail-2014.csv”)
budget.sort(‘amount’,ascending=False,inplace=True)
budget = budget[:>10]
设置数据和图表类型.
data = Data([
Bar(
x=budget["detail"],
y=budget["amount"]
)
])
我还决定添加一些额外布局信息.
layout = Layout(
title='2014 MN Capital Budget',
font=Font(
family='Raleway, sans-serif'
),
showlegend=False,
xaxis=XAxis(
tickangle=->45
),
bargap=>0.05
)
最后,绘制数据.这将打开一个浏览器,带有你完成的绘图.你可以使用 py.image.save_as保存本例副本.这是个很cool的功能.你得到丰富的基于网络报告的交互,和保存本地副本用于嵌入文件的能力.
fig = Figure(data=data, layout=layout)
plot_url = py.plot(data,filename='MN Capital Budget - 2014')
py.image.save_as(fig, 'mn-14-budget.png')
检查全交互式版本.你可以看到很多很棒的例子.箱图很吸引人并具有高度交互性.因为文档和pythonAPI,运行非常简单,我喜欢最终产品.
总结
在python生态环境中绘制数据有两面性.好的方面是有很多选择.坏的方面是有很多选择.尝试弄清楚那个适合你,取决于你需要完成什么.在某种程度上,你需要弄清楚用的工具能不能工作.我没有看到明显赢家和输家.下面是我一些想法:
- pandas非常方便,但你必须愿意学习matplotlib定制。
- Seaborn可以支持一些更复杂的可视化的方法,但仍需要matplotlib知识来调整。颜色方案是不错。
- ggplot有很多的承诺,但经过阵痛仍在继续。
- Bokeh 是一个强大的工具,如果你想建立自己的可视化服务器,但可能在简单场景有些大材小用。
- pygal由于能够产生互动的SVG图形和PNG文件是独一无二的。它并不像基于matplotlib方案灵活。
- Plotly产生互动性最强的图形。您可以离线保存,并创建非常丰富的基于网络的可视化效果。
目前的情况是,我会继续观看ggplot图像的进步和使用pygal,在需要交互性的时候使用plotly。随意在评论中提供反馈。我相信,人们将有很多关于这一主题的问题和意见。如果我错过了什么或者有其他的选择了,让我知道。