python可视化工具概述

发布时间: 2015-11-05 阅读数: 3777

本文阐述和比较了python的主要数据可视化包,包括Pandas,Seaborn, ggplot,Bokeh,pygal和Plotly。作者Chris Moffitt

简介

在python领域,有多种选项来可视化你的数据。由于这个多样性,我们在选择使用其中某一个的时候真的有点挑战性。这篇文章包含了一些比较受欢迎的案例,并描述了如何使用它们来创建简单的条形图。我将用以下几个包来举例说明:

比如,我会使用pandas来操作数据,并用它来作可视化。在大多数情况下,这些工具使用的时候没有用到pandas,但是我认为pandas和可视化工具的结合是如此的普遍,这会是很好的开始。

Matplotlib是什么?

Matplotlib是python数据可视化包的鼻祖,它很强大但也复杂。通常你可以用matplotlib包来做任何你想做的可视化工作,但它不会是你想的那么简单。我不会草率的用Matplotlib来处理实例,因为有许多工具(特别是Pandas和Seaborn)是封装在matplotlib之上的。如果你想阅读更多关于它的资料,请参考我的若干文章

我对Matplotlib最大的抱怨是,得到一幅合理的图需要做太多的工作。在下面的这些例子中,我发现可以使用少量的代码来实现漂亮的可视化。关于matplotlib特性的一个小案例,可以参考一篇关于ggpolt的报导

方法论

在这篇文章我将快速的描述下我的方法论。我确认只要你们开始在阅读这段文字,你们一定可以找到更好的方式来使用这些工具。,我的目的不是在每个案例中额外的创建相同的图形,我是想在每个案例中用大致相同的方式和时间来达到可视化数据的解决方案。

在整个过程中,我遇到的最大挑战是如何用一些大的标签来使得X轴和Y轴的格式看起来是合理的。也花了一些时间来解决在每种工具下数据的格式问题。一旦解决我说的这些部分,剩下的相对就简单了。

另一个需要说明的是,条形图可能是最容易绘制的图表类型了。这些工具可以让你绘制更多类型的图表。我的案例更多的是聚焦在那些格式比较简单 的情况下数据的可视化。另外,因为标签的原因,一些图占用了大量的空间。因此我只保留了在文章长度范围内的图片部分。最后,我缩放了一些图片以至于看起来有些模糊,并且有些难反映图片的真实质量了。

最后,我抱着试试的态度,使用了另一个工具来代替Excel。我认为我的这些例子可以更直观的显示在一份报告,陈述,email,或静态网页中。如果你正在评估这些工具可视化数据的实际时间或是通过一些渠道正在分享其他一些机制,以及这些工具所提供的其他一些性能,那我并没有涉及。

数据集

之前的一篇文章描述了我们将使用的数据。这个数据集包含125条记录,为了简单起见,我只关注前10行。完整的数据集见这里

Pandas

我使用一个pandas的数据框作为这些图的开始。幸运的是,pandas支持封装在matplotlib上的一个内置绘图函数。以它为基准,首先导入我们的模块并读取数据到一个budget数据框中。我们也可以对数据进行排序并限定为10行。

budget = pd.read_csv("mn-budget-detail-2014.csv")
budget = budget.sort('amount',ascending=False)[:10]

我们在所有的案例中使用相同的预算线,这里是前五条记录:

category detail amount
46 ADMINISTRATION Capitol Renovation and Restoration Continued 126300000
1 UNIVERSITY OF MINNESOTA Minneapolis; Tate Laboratory Renovation 56700000
78 HUMAN SERVICES Minnesota Security Hospital – St. Peter 56317000
0 UNIVERSITY OF MINNESOTA Higher Education Asset Preservation and Replac… 42500000
5 MINNESOTA STATE COLLEGES AND UNIVERSITIES Higher Education Asset Preservation and Replac… 42500000

现在,设置一些显示参数并创建一个条形图:

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可以通过改变调色板来使得图形更加的好看。另外,seanborn不为我们做很多简单的图表。标准的导入和读取数据如下:

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类似于Seanborn,也是建立在matplotlib之上,通过简单的方式就可以改善matplotlib可视化的视觉吸引力。它从R中的ggplot2的一个接口seaboran演化而来。鉴于此,一些API不是python的,但它仍然非常强大。我没有在R中使用过ggplot,所以我在这里也是一个学习的过程。这个库正在不断地发展中,我希望它能继续发展成熟,因为它会是一个好的选择。导入并读取数据如下:

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

这里似乎有一点奇怪——特别是使用 来显示这个图形。然而,我发现它相对是简单的。它确实需要找到如何旋转90度以及如何来排序x轴上的标签。我发现最酷的功能是用scale_y_continous来使得标签更加好看。如果想保存文件,用ggsave很容易就实现了:

ggsave(p, "mn-budget-capital-ggplot.png")

这里是最终图形。我可以添加颜色,但由于时间关系我没这样做

Bokeh

Bokeh不同于前面三个包,它不依赖于matplotlib。它是面向于现代web浏览器来生成可视化。它是为了实现交互式的web可视化。导入并读取数据:

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文件对于制作交互式图表非常有用。Pygal可以很容易的创建具有视觉吸引力的图表。导入并读取数据:

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')

一个有趣的标注是 用来对数据进行格式化。现在我们需要把数据加入到表中。这里需要跟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 key。然后所有工作,都很容易进行了。需要注意的一点是,所有东西,都将发到web上,所以,请确保你对付web没有问题。有一个选项,可以让图表私有,这样,你可以在这方面进行控制。Plotly能很好地与pandas集成。有问题的时候,可以向开发方发邮件,能很快收到回复。对他们的答复很满意。 好了,Import并读入数据:

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 = 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 保存为图像的。很酷吧!你不但可以看到基于web的报告,还有可以嵌入到文档中的本地版本。

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')

打开这个链接,可以在线看一下效果:https://plot.ly/~chris1610/12,还有其它更多例子在这个网站。所见所得的图表,非常吸引人,而且高度互动。得益于文档和python API,起步入门是很容易的,我喜欢这个最终产品。

总结

在Python生态系统中绘图,既有优点,也有缺点。好处是,有很多工具可用。缺点也是,有很多工具可用。找到适合自己的,取决于你需达到的目标。有时候,你需要试用这些工具后,才知道哪个适合你。我们不能断定哪个好,哪个不好。

下面是我总结的看法:

  • Pandas对于简单绘图,可以随手用,但你需要学习定制matplotlib。
  • Seaborn可以支持更多复杂的可视化方式,但仍然需要matplotlib知识,上色功能是个亮点。
  • ggplot有很多功能,但还需要发展。
  • bokeh是一个有效的工具,如果你想建立一个可视化的服务器,这几乎是杀鸡用牛刀的事情。
  • pygal独立运行,可用来生成交互的svg图表和png文件。它没有基于matploglib的方案那样灵活。
  • Plotly可生成大多数可交互图表。你可以保存为离线文件,然后建立丰富的基于web的可视化。

本文由雪晴数据网翻译自http://www.kdnuggets.com/2015/11/overview-python-visualization-tools.html。转载请注明译文链接http://www.xueqing.tv/cms/article/67

分享到:
热门文章

REmap发布,用R绘制百度迁徙图

2015年07月23日更新 21043次阅读

学习R语言,一篇文章让你从懵圈到入

2016年05月09日更新 14656次阅读

清华大学教授:大数据时代 统计学依

2015年08月07日更新 11281次阅读

在R中填充缺失数据—mice包

2015年12月31日更新 10705次阅读

精通 R plot—第一部分:颜色

2016年01月20日更新 9497次阅读

非统计学专业的人该如何学习 R 语

2015年07月24日更新 8102次阅读
热门课程

R语言初级课程

2015年02月20日发布 3230名学员

R语言高效数据清理工具包dplyr

2015年08月30日发布 1687名学员

R语言数据分析入门

2016年05月10日发布 1563名学员

如何用R做数据预处理

2016年06月03日发布 1160名学员

全栈数据工程师养成攻略

2016年11月08日发布 1019名学员

R语言大规模数据分析实战

2015年12月17日发布 952名学员
登录 注册