【学习】Python可视化工具概述-外文编译

本文由 PPV课 - korobas 翻译,未经许可,禁止转载! 原文翻译链接:http://pbpython.com/visualization-tools-1.html 一、介绍 在Python中,有很多数据可视化途径。因为这种多样性,造成很难选择。本文包括一些比较常见的可视化工具的样例,并将指导如何利用它们来创建简单的条形图。我将采用下面的工具来创建绘图数据示例: Pandas Seaborn ggplot Bokeh pygal Plotly 在实例中,我们利用pandas来操作数据,驱动可视化。大多数情况下,这些工具的使用是不需要pandas的,但我觉得混用pandas和可视化工具比较常见,也是很好的起点。 Matplotlib是什么? python可视化工具包起源于Matplotlib。它非常强大,也很复杂。你可以使用它做几乎所有的事情,然而,它并不是很易于学习。我不打算讲述纯Matplotlib实例,因为很多工具(尤其是Pandas和Seaborn)都对它进行了封装。如果你需要更多的了解,请参考我的simple graphing相关文章: http://pbpython.com/simple-graphing-pandas.html 我对Matplotlib抱怨最多的就是,要得到合理的图表,需要付出很多。在练习下面这些例子中,我发现不需要很多代码,就可以得到很好看的可视化效果。如果你需要一些较小例子,用来学习matplotlib详细特征,可以在ggplot post中找到相关的实例:http://pbpython.com/simple-graphing-pandas.html 关于方法 本文中是我所提到的方法。我相信大家在阅读时,也会想到更好的使用这些工具的方法。我的目标,不是在每个示例中去创建完全一致的图表,而是关注,在每个例子中以大致相同的方式对数据进行可视化,以及大致相同的时间的研究方案。 在学习过程中,碰到的最大的挑战,就是格式化x轴和y轴,使用大的标签使数据看起来合理。同样还需要时间弄清楚每个工具需要格式化的数据。一旦搞清楚这些,其它的就相对简单了。 另一个需要考虑的地方,条形图可能是一种比较简单的类型。这些工具允许你使用数据创建各种各样的图形。我的实例更多关注的是格式化相关的易用性,而不是可视化创新。另外,因为标签,一些图占用更多的空间,所以,我已进行处理,以便文章长度适中。最后,图片大小也修改了,缩放后有些模糊,但不影响学习。 最后,我试着使用另一个工具代替Excel。我想让我的例子能更直观地显示在报告,展示,邮件或者是静态页面。如果你正在评估工具的实时数据可视化或通过其它方式的共享机制,以及这些工具更多的功能,我在本文中暂时不作介绍。 数据集 在上一篇文章中(http://pbpython.com/web-scraping-mn-budget.html),描述了我们用到的数据。在数据抓取例子中,更深入点,在每个类别中确定详细的支出项。数据集包括125行支出项,但我只需要关注top10,这样可以简单些。你可以在此找到详细的数据集:http://pbpython.com/extras/mn- ... 4.csv Pandas 我将使用pandas的DataFrame来开始画各种图形。幸运的是,pandas提供内置的图表功能,它封装了matplotlib。我将使用它来作为基线。 首先,导入我们的模块,将数据读入设定的DataFrame。我们还需要对数据排序,并限制在top10中。 budget = pd.read_csv("mn-budget-detail-2014.csv") budget = budget.sort('amount',ascending=False)[:10] 我们将在所有实例中,使用同样的设定,下面是查看到的top5情况:

现在可以建立display,使用更好的defaults,创建条形图:

pd.options.display.mpl_style = 'default'
budget_plot = budget.plot(kind="bar",x=budget\["detail"\],
                      title="MN Capital Budget - 2014",
                      legend=False

这使用"default"列创建的图表,显示标题,去掉了图例。 再加上下面的代码,可以将图片保存为png格式文件 。

fig = budget_plot.get_figure()
fig.savefig("2014-mn-capital-budget.png")

看看生成的效果:

基本上,看起来很好了。想想,还可以在y轴上做更多的格式化处理,但这样,就需要了解matplotlib了。好了,就这样,仅通过pandas,我们不能做更多的定制了。 Seaborn Seaborn是一个可视化库,基于matplotlib。它会使用数据看起来更具有吸引力,还可以很简单地创建更复杂的图表,也可以和pandas集成。 我的seaborn例子不能搞得太差异化了。有一件事,我喜欢seaborn各种内置的样式,你可以快速地改变调色板,这样看起来更好一些。否则,对于简单图形,seaborn不能做更多了。 先import以及读入数据:

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,而是在浏览器中生成可视化。这意味着可以产生交互的web可视化,这样我的实例有点简单了。 Import,然后读取数据:

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]</pre>
bokeh不同的方面,在于,我需要明确地列出,我们需要绘图的值。<pre class="brush: python">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 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生态系统中绘图,既有优点,也有缺点。好处是,有很多工具可用。缺点也是,有很多工具可用。找到适合自己的,取决于你需达到的目标。有时候,你需要试用这些工具后,才知道哪个适合你。我们不能断定哪个好,哪个不好。 下面是我总结的看法: 1、Pandas对于简单绘图,可以随手用,但你需要学习定制matplotlib。 2、Seaborn可以支持更多复杂的可视化方式,但仍然需要matplotlib知识,上色功能是个亮点。 3、ggplot有很多功能,但还需要发展。 4、bokeh是一个有效的工具,如果你想建立一个可视化的服务器,这几乎是杀鸡用牛刀的事情。 5、pygal独立运行,可用来生成交互的svg图表和png文件。它没有基于matploglib的方案那样灵活。 6、Plotly可生成大多数可交互图表。你可以保存为离线文件,然后建立丰富的基于web的可视化。 相比之下,我会继续跟踪ggplot, 在交互上有需要的时候,会考虑使用pygal和plotly。

原文发布于微信公众号 - PPV课数据科学社区(ppvke123)

原文发表时间:2015-03-18

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏媒矿工厂

IP现场直播场景下生产端延迟分析与设计

在现场制作过程中,人们常常需要对多个几乎同时到达的音视频数据流进行实时编辑处理。如果这些数据流之间存在比较明显的延迟,就有可能影响到制作过程的效率。因此,设计这...

2023
来自专栏FreeBuf

看我如何基于Python;Facepp打造智能监控系统

由于种种原因,最近想亲自做一个基于python&facepp打造的智能监控系统。 0x00:萌芽 1:暑假在家很无聊 想出去玩,找不到人。玩个lol(已卸载),...

5355
来自专栏ThoughtWorks

TW洞见 | 可视化你的足迹

今日洞见 文章作者来自ThoughtWorks:邱俊涛。 本文所有内容,包括文字、图片和音视频资料,版权均属ThoughtWorks公司所有,任何媒体、网站或个...

38312
来自专栏瓜大三哥

IO约束(上)

IO约束的语法 XDC中可以用于IO约束的命令包括: set_input_delay set_output_delay set_max_delay set_mi...

2158
来自专栏AI科技评论

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

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

47018
来自专栏AI研习社

聊天机器人还能这么玩!教你用 Tensorflow 搭建能理解语境的客服小二!

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

5275
来自专栏科研利器

如何下载文献全文&快速找到文献DOI号【史上最强总结】

之前,本公众号推送过一个免费秒下学术文献的神器 SciHub Desktop,只需要将文献的 DOI 号输入进去再点击按钮就可以立马获取 PDF 全文,这款软件...

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

测试建模 :从尔康的鼻孔说开来,重要的用例写三遍

看完本文你会了解以下内容 1. 什么是SUT模型 2. 测试建模在工作中究竟是怎样一个过程 3. 从业务流程到测试用例我们忽略了什么 4. 测试建模会有哪些产出...

2035
来自专栏linux驱动个人学习

GPU与CPU的区别

1603
来自专栏数据科学与人工智能

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

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

41710

扫码关注云+社区

领取腾讯云代金券