专栏名称: 36大数据
关注大数据和互联网趋势,最大,最权威,最干货的大数据微信号(dashuju36)。大数据第一科技媒体。不发软文,只做知识分享。
目录
相关文章推荐
51好读  ›  专栏  ›  36大数据

干货 | 7 款 Python 数据图表工具的比较

36大数据  · 公众号  · 大数据  · 2017-09-05 07:50

正文

请到「今天看啥」查看全文


我们用 import matplotlib.pyplot as plt 导入 matplotlib 描点函数。然后我们就使用 %matplotlib inline 来设置 matplotlib 在 ipython 的 notebook 中描点,最终我们就利用 plt.hist(route_lengths, bins=20) 得到了一个柱状图。正如我们看到的,航空公司倾向于运行近距离的短程航线,而不是远距离的远程航线。


使用 seaborn


我们可以利用 seaborn 来做类似的描点,seaborn 是一个 Python 的高级库。Seaborn 建立在 matplotlib 的基础之上,做一些类型的描点,这些工作常常与简单的统计工作有关。我们可以基于一个核心的概率密度的期望,使用 distplot 函数来描绘一个柱状图。一个核心的密度期望是一个曲线 —— 本质上是一个比柱状图平滑一点的,更容易看出其中的规律的曲线。

import seaborn 
seaborn.distplot(route_lengths, bins=20)

正如你所看到的那样,seaborn 同时有着更加好看的默认风格。seaborn 不含有与每个 matplotlib 的版本相对应的版本,但是它的确是一个很好的快速描点工具,而且相比于 matplotlib 的默认图表可以更好的帮助我们理解数据背后的含义。如果你想更深入的做一些统计方面的工作的话,seaborn 也不失为一个很好的库。


条形图


柱状图也虽然很好,但是有时候我们会需要航空公司的平均路线长度。这时候我们可以使用条形图--每条航线都会有一个单独的状态条,显示航空公司航线的平均长度。从中我们可以看出哪家是国内航空公司哪家是国际航空公司。我们可以使用pandas,一个python的数据分析库,来酸楚每个航空公司的平均航线长度。

import numpy# Put relevant columns into a dataframe.route_length_df = pandas.DataFrame({"length": route_lengths, "id": routes["airline_id"]})# Compute the mean route length per airline.airline_route_lengths = route_length_df.groupby("id").aggregate(numpy.mean)# Sort by length so we can make a better chart.airline_route_lengths = airline_route_lengths.sort("length", ascending=False)

我们首先用航线长度和航空公司的id来搭建一个新的数据框架。我们基于airline_id把route_length_df拆分成组,为每个航空公司建立一个大体的数据框架。然后我们调用pandas的aggregate函数来获取航空公司数据框架中长度列的均值,然后把每个获取到的值重组到一个新的数据模型里。之后把数据模型进行排序,这样就使得拥有最多航线的航空公司拍到了前面。


这样就可以使用matplotlib把结果画出来。

plt.bar(range(airline_route_lengths.shape[0]), airline_route_lengths["length"])

Matplotlib的plt.bar方法根据每个数据模型的航空公司平均航线长度(airline_route_lengths[“length”])来做图。


问题是我们想看出哪家航空公司拥有的航线长度是什么并不容易。为了解决这个问题,我们需要能够看到坐标轴标签。这有点难,毕竟有这么多的航空公司。一个能使问题变得简单的方法是使图表具有交互性,这样能实现放大跟缩小来查看轴标签。我们可以使用bokeh库来实现这个--它能便捷的实现交互性,作出可缩放的图表。


要使用booked,我们需要先对数据进行预处理:

def lookup_name(row):    try:
        # Match the row id to the id in the airlines dataframe so we can get the name.        name = airlines["name"][airlines["id"] == row["id"]].iloc[0]
    except (ValueError, IndexError):
        name = ""    return name# Add the index (the airline ids) as a column.airline_route_lengths["id"] = airline_route_lengths.index.copy()# Find all the airline names.airline_route_lengths["name"] = airline_route_lengths.apply(lookup_name, axis=1)# Remove duplicate values in the index.airline_route_lengths.index = range(airline_route_lengths.shape[0])

上面的代码会获取airline_route_lengths中每列的名字,然后添加到name列上,这里存贮着每个航空公司的名字。我们也添加到id列上以实现查找(apply函数不传index)。


最后,我们重置索引序列以得到所有的特殊值。没有这一步,Bokeh 无法正常运行。


现在,我们可以继续说图表问题:

import numpy as npfrom bokeh.io import output_notebookfrom bokeh.charts import Bar, show
output_notebook()
p = Bar(airline_route_lengths, 'name', values='length', title="Average airline route lengths")
show(p)

用 output_notebook 创建背景虚化,在 iPython 的 notebook 里画出图。然后,使用数据帧和特定序列制作条形图。最后,显示功能会显示出该图。


这个图实际上不是一个图像--它是一个 JavaScript 插件。因此,我们在下面展示的是一幅屏幕截图,而不是真实的表格。


有了它,我们可以放大,看哪一趟航班的飞行路线最长。上面的图像让这些表格看起来挤在了一起,但放大以后,看起来就方便多了。


水平条形图


Pygal 是一个能快速制作出有吸引力表格的数据分析库。我们可以用它来按长度分解路由。首先把我们的路由分成短、中、长三个距离,并在 route_lengths 里计算出它们各占的百分比。

long_routes = len([k for k in route_lengths if k > 10000]) / len(route_lengths)
medium_routes = len([k for k in route_lengths if k 10000 and k > 2000]) / len(route_lengths)
short_routes = len([k for k in route_lengths if k 2000]) / len(route_lengths)

然后我们可以在 Pygal 的水平条形图里把每一个都绘成条形图:

import pygalfrom IPython.display import






请到「今天看啥」查看全文