我在Python中使用Altair进行大部分可视化的原因

可悲的是,在Python中,我们没有ggplot2。

Python的可视化库matplotlib 非常强大matplotlib最近因为被归因于第一个黑洞图像而再次成为人们关注的焦点。
但有严重的局限性。有时它的灵活性是一种祝福,但很容易让人感到沮丧,为你的图形添加一个小功能。此外,matplotlib双面向对象和基于状态的界面令人困惑。即使我多年来一直使用matplotlib,我仍然没有完全掌握它。最后,制作交互式图表并不容易。

Altair和图形语法

输入Altair。Altair是一个JavaScript高级可视化库Vega-Lite的包装器。Vega-Lite之一在本文的其余部分,我将主要参考Altair,但Vega-Lite应该获得尽可能多(或更多)的功劳。
最重要的功能是它的API基于图形语法。

图形语法可能听起来像一个抽象的功能,但它是Altair和其他Python可视化库之间的主要区别。Altair符合我们推理数据可视化的方式。

Altair只需要三个主要参数:

  • 标记。您想要点数表示的数据吗?行呢?吧?界?
  • 频道。哪个变量应该映射到x轴?到y轴?到商标的颜色?达到商标的大小?
  • 编码。变量是日期吗?一个号码?一个类别?

基于这些Altair将选择合理的默认值来显示您的数据。

我最喜欢的Altair感性的例子是它如何选择颜色。如果您告诉Altair为定量变量着色,那么它将使用连续色标(浅蓝色,蓝色,深蓝色)。如果你告诉Altair为分类变量着色Vega-Lite有两种类型的分类数据:名义数据和序数数据。标称是订单没有意义的类别。例如,欧洲,亚洲,非洲,美洲和大洋洲的大陆(对我来说,美国是一个大陆,而不是美国)。序数是订单有意义的类别。例如,亚马逊评论可以是一星,二星,三星,四星或五星。
然后它将为每个类别(红色,黄色,蓝色)使用不同的颜色。

让我们看一个具体的例子:

我组成了6个国家和人口数量。数据如下所示:

1
2
3
4
5
6
import pandas as pd
import altair as alt

data = pd.DataFrame({'country_id': [1, 2, 3, 4, 5, 6],
'population': [1, 100, 200, 300, 400, 500],
'income': [50, 50, 200, 300, 300, 450]})
COUNTRY_ID 人口 收入
1 1 50
2 100 50
3 200 200
4 300 300
400 300
6 500 450

我们将首先绘制每个国家的人口数据:

1
2
3
4
5
6
7
8
"""As we mentioned before, we need to define 3 parameters:
1. Mark: We do this by using "mark_circle".
2. Channel: We only define an x-axis and we map it to the population.
3. Encodings: We define both variables as quantitative by using :Q after the column name"""

categorical_chart = alt.Chart(data).mark_circle(size=200).encode(
x='population:Q',
color='country_id:Q')

这种着色有意义吗?这种着色有意义吗?

Altair选择了连续色标。这没有意义!问题是我们将country_id定义为一个定量变量,但它确实是一个绝对变量。

1
2
3
4
# We changed color='country_id:Q' to color='country_id:N' to indicate it is a nominal variable
categorical_chart = alt.Chart(data).mark_circle(size=200).encode(
x='population:Q',
color='country_id:N')

这更有意义!每个国家都应该以自己独特的颜色代表!这更有意义! 每个国家都应该以自己独特的颜色代表!

我们只更改了变量country_id的编码。我们使用N(Nominal)代替使用Q(定量)。这足以让Altair知道它不应该使用连续色标。

扩展图表

Altair的另一个美妙之处通常是您可以从现有图表中轻松构建。例如,假设我们现在想要为图表增加收入。我们只是告诉Altair将y轴映射到收入:

1
2
3
4
categorical_chart = alt.Chart(data).mark_circle(size=200).encode(
x='population:Q',
y='income:Q',
color='country_id:N')

二维Altair图

想要添加工具提示?您只需要一条线:

1
2
3
4
5
categorical_chart = alt.Chart(data).mark_circle(size=200).encode(
x='population:Q',
y='income:Q',
color='country_id:N',
tooltip=['country_id', 'population', 'income']))

这就是全部?

起初,我对使用另一个库的包装器作为我的主要可视化工具持怀疑态度。包装通常是个坏主意。例如,ggplot2的许多包装器尚未被Python社区广泛采用。很难创建功能完整且最新的功能。但是Altair是不同的:

  • Altair的API非常全面。感谢Jake Vanderplas(JVP)伟大的设计你可以用Vega-Lite做的一切,你可以用Python做。Altair只是一个用于生成有效Vega-Lite jsons的Python API。美妙之处在于API以编程方式生成,允许Altair在Vega-Lite新版本发布后全面且快速更新。
  • 直观和pythonic接口。像每个图书馆一样,需要一些时间来习惯。但Altair的精彩之处在于,所有设置都符合我们推理的方式。这才有意义。您将很快了解其内部运作并变得越来越高效。
  • 互动。Vega-Lite交互性非常强大。您可以使用一行代码添加工具提示。您可以将图表的选择与另一个可视化链接相关联

GIF显示牵牛星互动性Gif显示Altair互动性

  • 灵活性。Altair标记可以被认为是构建块。例如,我使用圆圈标记,线标记和文本标记的组合制作了下面的图表(示例中包含假数据)。代码最终是可读的并且易于修改,这对matplotlib中的类似实现很难说。

线,圆和文本标记的组合。输出可以很容易地进行交互。线,圆和文本标记的组合。 输出可以很容易地进行交互。

Altair主要缺点

  • 没有3d绘图。如果3d可视化对您的日常工作很重要,那么Altair不适合您。
  • 牛郎星是没有D3.js。像许多高级可视化框架一样,Altair不是100%可定制的,在某些时候你会找到一个你无法用它做的图表。
  • 不是很好的统计支持。我仍然依赖Seaborn进行快速可视化,需要进行线性回归。

如果这让你兴奋(或至少好奇),我强烈推荐Altair的文档。这是一个简洁明了的起点。不要忘记查看示例库Altair内部的详细信息。以上为机翻结果,详情查看博客链接

来了,老弟
-------------    本文结束  感谢您的阅读    -------------
0%