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

时间:2022-04-29
本文章向大家介绍【Python环境】Python可视化工具综述,主要内容包括简介、Matplotlib怎么样?、方法论、数据集、Pandas、Seaborn、gglot、Bokeh、Pygal、Plot.ly、总结、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

简介

在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。