Python 中的可视化工具介绍

Python011

Python 中的可视化工具介绍,第1张

几周前,R语言社区经历了一场关于画图工具的讨论。对于我们这种外人来说,具体的细节并不重要,但是我们可以将一些有用的观点运用到 Python 中。讨论的重点是 R 语言自带的绘图工具 base R 和 Hadley Wickham 开发的绘图工具 ggplot2 之间的优劣情况。如果你想了解更多细节内容,请阅读以下几篇文章:

其中最重要的两个内容是:

不是所有人都认同第二个观点,ggplot2确实无法绘制出所有的图表类型,但是我会利用它来做分析。

以下是 2016 年 4 月写的关于绘图工具的概述。出于多方面的原因,绘图工具的选取更多地取决于个人偏好,因此本文介绍的 Python 绘图工具也仅代表我的个人使用偏好。

Matplotlib 是一个强大的工具,它是 Pandas' builtin-plotting Seaborn 的基础。 Matplotlib 能够绘制许多不同的图形,还能调用多个级别的许多 API 。我发现 pyplot api 非常好用,你可能用不上 Transforms 或者 artists ,但是如果你有需求的话可以查阅帮助文档。我将从 pandas seaborn 图开始介绍,然后介绍如何调用 pyplot API

DataFrame Series 拥有 .plot 的命名空间,其中有许多图形类别可供选择(line, hist, scatter, 等等)。 Pandas 对象还提供了额外的用于增强图形展现效果的数据,如索引变量

由于 pandas 具有更少的向后兼容的限制,所以它具有更好的美学特性。从这方面来说,我认为 pandas 中的 DataFrame.plot 是一个非常实用的快速探索性分析的工具。

Michael Waskom 所开发的 Seaborn 提供了一个高层次的界面来绘制更吸引人统计图形。 Seaborn 提供了一个可以快速探索分析数据不同特征的 API 接口,接下来我们将重点介绍它。

Bokeh 是一款针对浏览器开发的可视化工具。

matplotlib 一样,**Bokeh

** 拥有一系列 API 接口。比如 glpyhs 接口,该接口和 matplotllib 中的 Artists 接口非常相似,它主要用于绘制环形图、方形图和多边形图等。最近 Bokeh 又开放了一个新的图形接口,该接口主要用于处理词典数据或 DataFrame 数据,并用于绘制罐头图。

以下是一些本文没有提到的可视化工具:

我们将利用 ggplot2 中的 diamonds 数据集,你可以在 Vincent Arelbundock's RDatasets 中找到它(pd.read_csv(' http://vincentarelbundock.github.io/Rdatasets/csv/ggplot2/diamonds.csv') ),此外我们还需要检测是否已经安装 feather

[站外图片上传中……(4)]

Bokeh 提供了两个 API,一个是低级的 glyph API,另一个是高级的 Charts API。

[站外图片上传中……(5)]

还不是很清楚我们应该在啥时候利用 Bokeh 来进行探索性分析,不过它的交互式功能可以激发我的兴趣。就个人而言,由于习惯问题我平时仍然一直使用 matplotlib 来绘图,我还无法完全切换到 Bokeh 中。

我非常喜欢 Bokeh 的仪表盘功能和 bokeh server 的 webapps。

[站外图片上传中……(6)]

[站外图片上传中……(7)]

[站外图片上传中……(8)]

matplotlib 并不局限于处理 DataFrame 数据,它支持所有使用 getitem 作为键值的数据类型。

[站外图片上传中……(9)]

[站外图片上传中……(10)]

我们从列变量的名字中提取出轴标签,利用 Pandas 可以更加便捷地绘制一系列共享 x 轴数据的图形。

[站外图片上传中……(11)]

[站外图片上传中……(12)]

本文中的剩余部分将重点介绍 seaborn和为什么我认为它是探索性分析的强大工具。

我强烈建议你阅读 Seaborn 的 introductory notes,这上面介绍了 seaborn 的设计逻辑和应用领域。

我们可以通过一个稳定的且易懂的 API 接口来调用 Seaborn。

事实上,seaborn 是基于 matplotlib 开发的,这意味着如果你熟悉 pyplot API的话,那么你可以很容易地掌握 seaborn。

大多数 seaborn 绘图函数的参数都由 x, y, hue, 和 data 构成(并不是所有的参数都是必须的)。如果你处理的对象是 DataFrame,那么你可以直接将列变量的名称和数据集的名称一同传递到绘图函数中。

[站外图片上传中……(13)]

[站外图片上传中……(14)]

[站外图片上传中……(15)]

[站外图片上传中……(16)]

我们可以很轻易地探究两个变量之间的关系:

[站外图片上传中……(17)]

[站外图片上传中……(18)]

或者一次探究多个变量之间的关系:

[站外图片上传中……(19)]

[站外图片上传中……(20)]

pariplot 是 PairGrid 的一个包装函数,它提供了 seaborn 一个重要的抽象功能——Grid。Seaborn 的 Grid 将 matplotlib 中Figure 和数据集中的变量联系起来了。

我们有两种方式可以和 grids 进行交互操作。其一,seaborn 提供了类似于 pairplot 的包装函数,它提前设置了许多常见任务的参数;其二,如果你需要更多的自定义选项,那么你可以直接利用 Grid 方法。

[站外图片上传中……(21)]

[站外图片上传中……(22)]

[站外图片上传中……(23)]

34312 rows × 7 columns

[站外图片上传中……(24)]

[站外图片上传中……(25)]

FaceGrid 可以通过控制分面变量来生成 Grid图形,其中PairGrid是它的一个特例。接下来的案例中,我们将以数据集中的 cut 变量为分面变量来绘制图像:

[站外图片上传中……(26)]

[站外图片上传中……(27)]

最后一个案例展示了如何将 seaborn 和 matplotlib 结合起来。g.axes是matplotlib.Axes的一个数组,g.fig是matplotlib.Figure的一个特例。这是使用 seaborn 时常见的一个模式:利用 seaborn 的方法来绘制图像,然后再利用 matplotlib 来调整细节部分。

我认为 seaborn 之所以吸引人是因为它的绘图语法具有很强的灵活性。你不会被作者所设定的图表类型所局限住,你可以根据自己的需要创建新的图表。

[站外图片上传中……(28)]

[站外图片上传中……(29)]

[站外图片上传中……(30)]

[站外图片上传中……(31)]

本来,我打算准备更多的例子来介绍 seaborn,但是我会将相关链接分享给大家。Seaborn 的说明文档写的非常详细。

最后,我们将结合 scikit-learn 来介绍如何利用 GridSearch 来寻找最佳参数。

[站外图片上传中……(32)]

[站外图片上传中……(33)]

[站外图片上传中……(34)]

原文链接: http://tomaugspurger.github.io/modern-6-visualization.html

译者:Fibears

n.格子;栅栏;电网;网格;赛车起跑线

一,读音:英[ɡrɪd]         美[ɡrɪd]

二,例句

The cloth has a grid with square cells.

那块布有正方形的小格子。

三,词汇用法

1,cattle grid

(铺在公路坑洞之上的...

2,National grid

(英国)全国高压输电...

3,grid computing

网格计算

4,diffuser grid

扩散器栅,导流栅...

5,grid reference

参考坐标格网...

6,grid plate

格子板,栅板,铅板,.

扩展资料

【近义词】

network 网点

gridiron 橄榄球场

lattice 格子

net 网

web 网

grating 格子

import numpy as np

import pylab as pl

class Radar(object):

  def __init__(self, fig, titles, labels, rect=None):

      if rect is None:

          rect = [0.05, 0.05, 0.95, 0.95]

      self.n = len(titles)

      self.angles = np.arange(90, 90+360, 360.0/self.n)

      self.axes = [fig.add_axes(rect, projection="polar", label="axes%d" % i)

                       for i in range(self.n)]

      self.ax = self.axes[0]

      self.ax.set_thetagrids(angles, labels=titles, fontsize=14)

      for ax in self.axes[1:]:

          ax.patch.set_visible(False)

          ax.grid("off")

          ax.xaxis.set_visible(False)

      for ax, angle, label in zip(self.axes, self.angles, labels):

          ax.set_rgrids(range(1, 6), angle=angle, labels=label)

          ax.spines["polar"].set_visible(False)

          ax.set_ylim(0, 5)

  def plot(self, values, *args, **kw):

      angle = np.deg2rad(np.r_[self.angles, self.angles[0]])

      values = np.r_[values, values[0]]

      self.ax.plot(angle, values, *args, **kw)

titles = list("ABCDE")

labels = [

  list("abcde"), list("12345"), list("uvwxy"),

  ["one", "two", "three", "four", "five"],

  list("jklmn")

]

fig = pl.figure(figsize=(6, 6))

titles = list("ABCDE")

labels = [

  list("abcde"), list("12345"), list("uvwxy"),

  ["one", "two", "three", "four", "five"],

  list("jklmn")

]

radar = Radar(fig, titles, labels)

radar.plot([1, 3, 2, 5, 4],  "-", lw=2, color="b", alpha=0.4, label="first")

radar.plot([2.3, 2, 3, 3, 2],"-", lw=2, color="r", alpha=0.4, label="second")

radar.plot([3, 4, 3, 4, 2], "-", lw=2, color="g", alpha=0.4, label="third")

radar.ax.legend()