【Python环境】Python可视化工具综述

简介

在Python的世界里,可视化你的数据有多种选择。由于这种多样性,决定何时使用哪一个确实是种挑战。这篇文章包含由更受欢迎的包中的一部分制作的示例,并说明如何使用它们创建一个简单的条形图。我将使用:

  • Pandas
  • Seaborn
  • ggplot
  • Bokeh
  • pygal
  • Plotly

在例子中,我将使用Pandas处理数据并驱动可视化。大多数情况下这些工具可以在没有pandas的环境中运行,但是我认为pandas和可视化工具的结合非常普遍,这是最合适的开始之处。

Matplotlib怎么样?

Matplotlib是Python可视化软件包的始祖,它有非常强大的能力,但是随之而来的是复杂性。Matplotlib往往可以做到任何你想做的,但并非那么容易弄清楚。我不会进入一个纯粹的Matplotlib示例,因为许多工具(尤其是Pandas和Seaborn)是对Matplotlib的简单封装。如果你想要阅读更多关于它的信息,我在这篇simple graphing中介绍了几个例子。

我对Matplotlib最大的不满是,它需要太多工作以获得合理可读的图表。通过把玩这里的一些例子,我发现不需要太多代码就可以轻易获得不错的可视化。这篇gglpot文章里的例子可以侧面说明matplotlib的详细特性。

方法论

一个对这篇文章中我的方法论的快速注解。我敢肯定,只要人们开始阅读这篇文章,他们就能找出更好使用这些工具的方法。我的目标不是在每个示例中创建完全一致的图表,我希望以大致相同的方式可视化数据,在每个示例中也花费大致相同的时间研究解决方案。

在这个过程中,我遇到的最大挑战是格式化x轴和y轴,以及通过赋予一些大的标签使数据看起来合理。找出每种工具需要的数据格式也花费了一些时间。一旦决定了这些部分,其余都相对比较简单。

另一个需要考虑的问题是,条形图可能是简单类型的图表。这些工具允许你用数据绘制更多不同的类型。我的例子更多侧重于设计的方便性,而不是新颖的可视化案例。而且,由于一些图表的标签占用太多空间,我粗暴地切断了它们——只是为了保持文章的长度合理。最后,我调整了图片大小,因此任何模糊都是缩放导致的,不代表实际输出质量。

最后,我的想法接近于尝试使用另一种工具替代Excel的心态。我认为我的例子更多说明报告、演示文稿、电子邮件或者静态网页中的展示。如果你在评估实时数据可视化或通过一些其他机制共享的工具,那么这些工具中的一部分提供了更多我没有涉及的能力。

数据集

一篇先前的文章描述了我们将要使用的数据集。我抓取更深一层以确定每个类别中的详细支出项。该数据集包含125个项目,但是我选择只注重展示前10项,这样简单一些。你可以在这里找到完整数据集。

Pandas

我使用pandas的DataFrame作为所有不同例子的开始。幸运的是,pandas支持一个作为matplotlib上一层的内建绘图功能。我将用它作为基线。首先,引入我们的模块,把数据读入为名为budget的DataFrame。我们也要对数据进行排序,并选择前10大项目。

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

我们将在所有的例子中使用同样的预算行。下面是数据的前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 pdimport seaborn as snsimport matplotlib.pyplot as plt

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

我发现我必须通过x_order显式指定项目的顺序。下面的代码指定顺序,并设置图表样式和柱状图的颜色:

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

如你所看到的,我不得不使用matplotlin旋转x轴标签从而实际阅读它们。直观上显示效果不错。理想情况下,我想格式化y轴上的刻度,但是除了使用matplotlib中的plt.yticks,我没有其他的办法。

gglot

ggplot与seaborn类似,也建立在matplotlib上,目的是以简单的方式改进matplotlib可视化的视觉吸引力。与seaborn不同的是,它是R中ggplot2的一个移植。考虑到这一目标,其中一些API是非Python风格的,但是它很强大。我没有在R中用过ggplot,因此有点学习曲线。然而,我开始看到ggplot的美丽。这个库正在被积极地开发,我希望它继续成长成熟,因为我认为它可能成为一个真正强大的选择。在我的学习中,确实有几次费劲地搞清楚如何做某事。铜鼓哦看代码和一点搜索,我能够搞定大部分。继续导入和读取数据:

import pandas as pdfrom 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显示图形。不过我很容易就找到并解决了它。确实需要挖掘如何旋转x轴标签和指定它们的顺序。我发现最酷的特性是scale_y_continous,这让标签变得更好看。如果你想保存图像,使用ggsave很简单:

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

下面是最终的图像。它是灰度的,我可以上色,但没有花费时间这样做。

Bokeh

Boken和前三个库都不一样,它不依赖matplotlib,针对现代Web浏览器中的可视化生成。它的目的是制作交互web可视化,因此我的例子相当过分简单化。引入并读取数据:

import pandas as pdfrom 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 pdimport pygalfrom 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密钥设置。一旦完成,它看起来工作得非常顺畅。注意你所做的一切都将发布在互联网上,因此确保这样没问题。有一个选项可以保持图表私有,所以你可以控制这个特性。Ployly与pandas无缝整合,我也会高声说他们对我的电子邮件问题积极回应,我很感激他们及时的答复。设置导入和读入数据:

import plotly.plotly as pyimport pandas as pdfrom plotly.graph_objs import *

budget=pd.read_csv(“mn-budget-detail-2014.csv”)
budget.sort(‘amount’,ascending=False,inplace=True)
budget = budget[:>10]

为plotly设置数据和图表类型:

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。这是非常棒的功能,你得到了基于浏览器报告的交互性,也能够保存本地副本以嵌入文档。

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

也可以查阅完整交互版本。你能在他们的网站上看到更多稳健的例子。箱线图的出现非常具有吸引力,且高度互动。由于文档和python的api,开始和运行都很容易,我喜欢最后这个产品。

总结

在Python生态系统中绘制数据图是一个好消息/坏消息的故事。好消息是有很多选择,坏消息是有太多选择。试图确定哪些适合你取决于你试图完成什么。在某种程度上,你需要把玩工具。我看不到一个明确的优胜者或失败者。下面是一些我的结束语:

  • Pandas便于简单绘图,但是自定义需要学习matplotlib。
  • Seaborn可以支持一些更复杂的可视化方法,但是仍然需要matplotlib知识进行调整。配色方案是一个额外优势。
  • ggplot很可能成功,但仍在经历成长的烦恼,
  • 如果你想要设置自己的可视化服务器,Bokeh是一个稳定的工具,但是对简单的场景可能过犹不及。
  • Pygal能独立生成交互式svg图形和png文件。它不如基于matplotlib的解决方案灵活。
  • Plotly生成最大程度交互的图标,你可以脱机保存它们,也可以创建非常丰富的web可视化效果。

就目前的情况来看,我会继续注意ggplot的进展,在需要交互性时使用pygal和plotly。

原文发布于微信公众号 - 数据科学与人工智能(DS_AI_shujuren)

原文发表时间:2015-11-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏谈补锅

apns关于APP数字角标的理解

  前两天群里有兄弟在吐槽,做远程推送的时候:老板要求APP桌面图标的右上角显示红色未读数字(数字角标)要精准,有多少未读通知就显示数字几;但是后台的弟兄在发送...

2053
来自专栏数据小魔方

R语言数据地图——美国地图

之前有过一段时间,特别热衷于数据地图,也分享很多篇关于地图制作的教程(涉及到各种作图软件),但大多是整理拼凑,自己发挥的不多。 最近在看哈德利.威科姆的那本火遍...

5685
来自专栏AI科技评论

开发 | 用 Tensorflow 搭建能理解语境的聊天机器人!

想掌握对话沟通,语境为王。 我们将使用Tensorflow构建一个聊天机器人框架,向大家示范如何实现上下文的语境处理。 ? 有没有想过为什么大多数聊天机器人缺乏...

47118
来自专栏腾讯移动品质中心TMQ的专栏

组合测试从理论到实践——从吃货的角度实现组合测试用例的自动设计

从吃货的角度观察组合 作为一名合格的吃货,小编我每天为了吃的健康着实费了不少心思,每周我都会根据应季蔬果来定制一周的饮食,以下是我这周的定制计划: 蔬菜类: 豆...

2748
来自专栏CDA数据分析师

Python告诉你:单词软件火了,但真的有那么多人在背单词吗?

0x00 前言 你想知道背单词软件有大概多少人注册第一天都没有背完嘛? 你想知道背单词软件这么火,这么多人在使用,真的有多少人真的在背诵嘛? 别急,Python...

2427
来自专栏文智的专栏

【 文智背后的奥秘 】系列篇:结构化抽取平台

随着大数据时代的到来,一个大规模生成、分享、处理以及应用数据的时代正在开启。如果能将互联网上异源异构的非结构化或半结构化数据转换为更易处理的结构化数据,可以极大...

2.1K2
来自专栏WeTest质量开放平台团队的专栏

UPA性能分析工具使用详解

自从WeTest宣布与Unity官方共同推出Unity性能分析工具UPA(Unity Performance Analysis)以来(Hi,我们和Unity合作...

1312
来自专栏SDNLAB

P4编程理论与实践——理论篇

由于对SDN充满着兴趣,在学习了一段时间OpenFlow之后,一次偶然的机会接触到了P4。P4可以实现很多新的Idea,但是无奈于国内的实践资料太少了(有些资料...

6429
来自专栏CSDN技术头条

使用TCP时序图解释BBR拥塞控制算法的几个细节

周六,由于要赶一个月底的Deadline,因此选择了在家VPN加班,大半夜就爬起来跑用例,抓数据……自然也就没有时间写文章和外出耍了,不过利用周日的午夜时间(不...

56610
来自专栏瓜大三哥

FPGA内部资源介绍

3352

扫码关注云+社区

领取腾讯云代金券