数据可视化工具

时间:2021-04-14 03:47:14

http://blog.csdn.net/pipisorry/article/details/24833173

Python数据图表和绘图工具

Python 的科学栈相当成熟,各种应用场景都有相关的模块,包括机器学习数据分析。数据可视化是发现数据和展示结果的重要一环,只不过过去以来,相对于 R 这样的工具,发展还是落后一些。

幸运的是,过去几年出现了很多新的Python数据可视化库,弥补了一些这方面的差距。matplotlib 已经成为事实上的数据可视化方面最主要的库,此外还有很多其他库,例如vispy,bokeh, seaborn,  pyga, folium 和 networkx,这些库有些是构建在 matplotlib 之上,还有些有其他一些功能。

本文会基于一份真实的数据,使用这些库来对数据进行可视化。通过这些对比,我们期望了解每个库所适用的范围,以及如何更好的利用整个 Python 的数据可视化的生态系统。

我们在 Dataquest 建了一个交互课程,教你如何使用 Python 的数据可视化工具。如果你打算深入学习,可以点这里

探索数据集

在我们探讨数据的可视化之前,让我们先来快速的浏览一下我们将要处理的数据集。我们将要使用的数据来自 openflights。我们将要使用航线数据集机场数据集航空公司数据集。其中,路径数据的每一行对应的是两个机场之间的飞行路径;机场数据的每一行对应的是世界上的某一个机场,并且给出了相关信息;航空公司的数据的每一行给出的是每一个航空公司。

首先我们先读取数据:

1 airportshead)

数据可视化工具

1 routeshead)

数据可视化工具

我们可以分别对每一个单独的数据集做许多不同有趣的探索,但是只要将它们结合起来分析才能取得最大的收获。Pandas 将会帮助我们分析数据,因为它能够有效的过滤权值或者通过它来应用一些函数。我们将会深入几个有趣的权值因子,比如分析航空公司和航线。

那么在此之前我们需要做一些数据清洗的工作。

12345678910111213 import haversinelon1lat1lon2lat2:# Convert coordinates to floats.lon1lat1lon2lat2 [()floatlat1, ()floatlat2]# Convert to radians from degrees.lon1lat1lon2lat2 mapmathradians[, , , ]        = -     = -     = .(/)*+ .() mathcoslat2* .(/)*    = * .(.()    = *     km

然后我们就可以使用一个函数来计算起点机场和终点机场之间的单程距离。我们需要从路线数据框架得到机场数据框架所对应的 source_id 和 dest_id,然后与机场的数据集的 id 列相匹配,然后就只要计算就行了,这个函数是这样的:

1234567891011 def calc_dist(row):    dist = 0    try:        # Match source and destination to get coordinates.        source = airports[airports["id"] == row["source_id"]].iloc[0]        dest = airports[airports["id"] == row["dest_id"]].iloc[0]        # Use coordinates to compute distance.        dist = haversine(dest["longitude"], dest["latitude"], source["longitude"], source["latitude"])    except (ValueError, IndexError):        pass    return dist

如果 source_id 和 dest_id 列没有有效值的话,那么这个函数会报错。因此我们需要增加 try/catch 模块对这种无效的情况进行捕捉。

最后,我们将要使用 pandas 来将距离计算的函数运用到 routes 数据框架。这将会使我们得到包含所有的航线线长度的 pandas 序列,其中航线线的长度都是以公里做单位。

_lengths routesapplycalc_distaxis1
12345 import matplotlib.pyplot as plt %matplotlib inline   plt.hist(route_lengths, bins=20)

数据可视化工具

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

使用 seaborn

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

seaborn seaborndistplotroute_lengthsbins20
1 pltbarrangeairline_route_lengthsshape0)airline_route_lengths"length")

数据可视化工具

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

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

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

12345678910111213 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 无法正常运行。

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

numpy npfrom .import bokehcharts Barshowoutput_notebook)Barairline_route_lengths'name'values'length'title"Average airline route lengths"()

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

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

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

水平条形图

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

Python
123 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 的水平条形图里把每一个都绘成条形图:

数据可视化工具

首先,我们创建一个空图。然后,我们添加元素,包括标题和条形图。每个条形图通过百分比值(最大值是100)显示出该类路由的使用频率。

最后,我们把图表渲染成文件,用 IPython 的 SVG 功能载入并展示文件。这个图看上去比默认的 matplotlib 图好多了。但是为了制作出这个图,我们要写的代码也多很多。因此,Pygal 可能比较适用于制作小型的展示用图表。

散点图

在散点图里,我们能够纵向比较数据。我们可以做一个简单的散点图来比较航空公司的 id 号和航空公司名称的长度:

Python[]applylambdax(())pltscatterairlines"id".())

数据可视化工具

首先,我们使用 pandasapplymethod 计算每个名称的长度。它将找到每个航空公司的名字字符的数量。然后,我们使用 matplotlib 做一个散点图来比较航空 id 的长度。当我们绘制时,我们把 theidcolumn of airlines 转换为整数类型。如果我们不这样做是行不通的,因为它需要在 x 轴上的数值。我们可以看到不少的长名字都出现在早先的 id 中。这可能意味着航空公司在成立前往往有较长的名字。

我们可以使用 seaborn 验证这个直觉。Seaborn 增强版的散点图,一个联合的点,它显示了两个变量是相关的,并有着类似地分布。

Python
12 data = pandas.DataFrame({"lengths": name_lengths, "ids": airlines["id"].astype(int)})seaborn.jointplot(x="ids", y="lengths", data=data)

数据可视化工具

上面的图表明,两个变量之间的相关性是不明确的——r 的平方值是低的。

静态 maps

我们的数据天然的适合绘图-机场有经度和纬度对,对于出发和目的机场来说也是。

第一张图做的是显示全世界的所有机场。可以用扩展于 matplotlib 的 basemap 来做这个。这允许画世界地图和添加点,而且很容易定制。

Python.importBasemap# Create a map on which to draw.  We're using a mercator projection, and showing the whole world.m=Basemapprojection'merc'llcrnrlat-,=,=180urcrnrlon180lat_ts20resolution'c'.(.(,y=mlistairports"longitude".(),listairports"latitude".())# Use matplotlib to draw the points onto the map.mscatterxy1marker'o'color'red'.(
123456789101112131415161718 # Make a base map with a mercator projection.  Draw the coastlines.m=Basemapprojection'merc'llcrnrlat-,=,=180urcrnrlon180lat_ts20resolution'c'.(,row[3000.(:    :        source=airportsairports"id"[].[]        [[]==row"dest_id"]iloc0# Don't draw overly long routes.        (([]([])<90# Draw a great circle between source and dest airports.            .(([],floatsource"latitude")([],floatdest"latitude")linewidth1color'b'except(,IndexError:         # Show the map.pltshow)

数据可视化工具

上面的代码将会画一个地图,然后再在地图上画线路。我们添加一了写过滤器来阻止过长的干扰其他路由的长路由。

画网络图

我们将做的最终的探索是画一个机场网络图。每个机场将会是网络中的一个节点,并且如果两点之间有路由将划出节点之间的连线。如果有多重路由,将添加线的权重,以显示机场连接的更多。将使用 networkx 库来做这个功能。

首先,计算机场之间连线的权重。

Python
1234567891011121314151617181920212223 # Initialize the weights dictionary.weights = {}# Keep track of keys that have been added once -- we only want edges with a weight of more than 1 to keep our network size manageable.added_keys = []# Iterate through each route.for name, row in routes.iterrows():    # Extract the source and dest airport ids.    source = row["source_id"]    dest = row["dest_id"]     # Create a key for the weights dictionary.    # This corresponds to one edge, and has the start and end of the route.    key = "{0}_{1}".format(source, dest)    # If the key is already in weights, increment the weight.    if key in weights:        weights[key] += 1    # If the key is in added keys, initialize the key in the weights dictionary, with a weight of 2.    elif key in added_keys:        weights[key] = 2    # If the key isn't in added_keys yet, append it.    # This ensures that we aren't adding edges with a weight of 1.    else:        added_keys.append(key)

一旦上面的代码运行,这个权重字典就包含了每两个机场之间权重大于或等于 2 的连线。所以任何机场有两个或者更多连接的路由将会显示出来。

Pythonasnxgraph=nxGraph)# Keep track of added nodes in this set so we don't add twice.nodes=set)# Iterate through each edge.forkinweightsitems)try# Split the source and dest ids and convert to integers.        ,dest=ksplit"_"sourceintsource,intdest]        ifsource:            .()        ifdest:            .()        # Sets don't allow duplicates.        .()        .()# Add the edge to the graph.        .(,dest=)    ValueError)passposnxspring_layoutgraph.(,,node_color'red'=,alpha0.8.(,,=,=)# Show the plot.pltshow)

总结

有一个成长的数据可视化的 Python 库,它可能会制作任意一种可视化。大多数库基于 matplotlib 构建的并且确保一些用例更简单。如果你想更深入的学习怎样使用 matplotlib,seaborn 和其他工具来可视化数据,在这儿检出其他课程。

[7 款 Python 数据图表工具的比较]

[开源:(Python)面向浏览器的数据可视化库mpld3(Matplotlib+D3js)]

[10个对所有学科都有用的Python数据可视化库]

[[[译]比一比:Python的七个数据可视化工具]]

皮皮blog



数据可视化方法

[A Periodic Table of Visualization Methods] [该多多尝试的七种数据可视化类型(以及如何开始)《7 Data Visualization Types You Should be Using More (and How to Start)》]

数据可视化绘图建议

[为何大多数人做出来的图表只是一坨屎?] [给科学家的数据可视化建议 《Data Visualization Advice for Scientists - Scientific American Blog Network》by Robert Simmon]

数据可视化工具

[The 38 best tools for data visualization]

[14 Data Visualization Tools to Tell Better Stories with Numbers]

[时间轴Timeline可视化作品及制作工具making timelines]

[ 数据可视化工具汇总]

[开源:基于matplotlib绘制Pandas时序数据Calendar heatmaps——Calmap Calendar heatmaps from Pandas time series data]

[Github十大数据可视化项目《Top 10 Data Visualization Projects on Github》by Matthew Mayo]

[GGobi data visualization system]

数据可视化实例

[50 Of The Greatest Data Visualization Examples]

[连载:全球最牛的28个大数据可视化应用案例(一)]

[全球最牛的28个大数据可视化应用案例(三)资金喷泉/担保圈毒刺/]

[网易关系网]

D3.js blocks示例分享/查询网站: [Search the Bl.ocks] [Searching for examples]

from:http://blog.csdn.net/pipisorry/article/details/24833173

ref: