Python 中的绘图库提供多种方式来根据您的喜好呈现数据,无论您喜欢灵活性、设计、易用性还是特定风格。

在 Altair 中绘图提供了一种与其他解决方案不同的解决方案,我发现它随着绘图完成量的增加而变得更简单。它有一个优雅的界面,这要归功于Vega,一种声明性的绘图语言,它允许你定义你的绘图应该是什么样子,而不是编写循环和条件来构造它们。

绘图流利

我通过绘制相同的多条图来比较每个 Python 绘图库。在我们继续之前,请注意,您可能需要调整 Python 环境才能运行此代码,包括以下内容。

  • 安装最新版本的 Python(Linux、Mac和Windows的说明)

  • 验证 Python 版本是否适用于教程中使用的库

数据可在线获取,并可使用 pandas 导入:

将熊猫导入为 pd

df \u003d pd.read_csv('https://anvil.works/blog/img/plotting-in-python/uk-election-results.csv')

现在我们准备好了。作为比较,这是我们在Matplotlib中制作的图:

Matplotlib 英国选举结果

图片来源:

英国选举结果的 Matplotlib 图(© 2020Anvil)

Matplotlib 图需要 16 行代码来创建,包括手动计算每个条的位置。

以下是在 Altair 中制作类似情节的方法:

将 altair 导入为 alt

图表 \u003d alt.Chart(df).mark_bar().encode(

x\u003d'派对',

y\u003d'座位',

列\u003d'年份',

颜色\u003d'派对',

)

chart.save('altair-elections.html')

简洁多了!就像Seaborn一样,Altair 处理每个变量有一列的数据(长格式)。这允许您将每个变量映射到绘图的一个方面——Altair 将这些方面称为“通道”。在我们的例子中,我们想要x-轴上的每个party一根柱,我们想要y-轴上每一方赢得的seats,并且我们想要将柱形按year分组到columns 中。我们也想把colorparty吧。这就是你用文字描述它的方式,这正是代码所说的!

这是情节的样子:

默认样式的 Altair 绘图

图片来源:

具有默认样式的 Altair 绘图(© 2020Anvil)

调整样式

更多 Python 资源

  • 什么是IDE?

  • 备忘单:适用于初学者的 Python 3.7

  • 顶级 Python GUI 框架

  • 下载:7 个必不可少的 PyPI 库

  • 红帽开发者

  • 最新 Python 内容

这离我们想要的并不远。与 Matplotlib 绘图的主要区别在于,每个 Altairyear组的显示中间都有一点空白——这只是 Altair 多条形图的一个特点,这不是问题。

但是,我们确实想要进行其他一些小的样式改进。

非整数值

两个非整数年份名称(Feb 1974Oct 1974)显示为NaN。我们可以通过将year值转换为字符串来解决这些问题:

    df['year'] = df['year'].astype(str)

指定排序顺序

然后我们还需要告诉 Altair 如何对数据进行排序。 Altair 允许我们通过传递Column对象来指定有关column通道的更多详细信息。所以我们告诉它按照数据出现在 DataFrame 中的顺序进行排序:

图表 \u003d alt.Chart(df).mark_bar().encode(

# ...

column\u003dalt.Column('year', sort\u003dlist(df['year']), title\u003dNone),

# ...

)

删除轴标题

我们通过设置title=None删除了绘图顶部的“年份”标签。让我们也从每一列中删除“派对”标签:

图表 \u003d alt.Chart(df).mark_bar().encode(

x\u003dalt.X('party', 标题\u003dNone),

# ...

)

指定颜色图

最后,我们要指定我们自己的颜色用于条形图。 Altair 允许我们指定domain中的值和range中的颜色之间的映射,这正是我们所需要的:

地图 \u003d {

'保守': '#0343df',

'劳工': '#e50000',

'自由':'#ffff14',

'其他': '#929591',

}

图表 \u003d alt.Chart(df).mark_bar().encode(

# ...

color\u003dalt.Color('party', scale\u003dalt.Scale(domain\u003dlist(cmap.keys()), range\u003dlist(cmap.values())))

)

带有样式调整的最终代码

应用这些样式调整后,我们的代码有点不那么悦目了,但它仍然使用使 Altair 具有如此可扩展性的声明性方法。我们仍然将数据中的自变量分配给绘图的不同方面,而不是像我们在 Matplotlib 中经常需要做的那样执行复杂的数据操作。唯一的区别是我们的变量名现在被包装在诸如alt.X()之类的对象中,这让我们可以调整它们的显示方式:

将 altair 导入为 alt

从选票导入只要 df

地图 \u003d {

'保守': '#0343df',

'劳工': '#e50000',

'自由':'#ffff14',

'其他': '#929591',

}

df['year'] \u003d df['year'].astype(str)

# 我们仍在分配,例如'party' 到 x,但现在我们已经把它包起来了

# 在 alt.X 中指定其样式

图表 \u003d alt.Chart(df).mark_bar().encode(

x\u003dalt.X('party', 标题\u003dNone),

y\u003d'座位',

column\u003dalt.Column('year', sort\u003dlist(df['year']), title\u003dNone),

color\u003dalt.Color('party', scale\u003dalt.Scale(domain\u003dlist(cmap.keys()), range\u003dlist(cmap.values())))

)

chart.save('altair-elections.html')

对 Matplotlib 公平地说,我们现在已经达到了与之前使用的代码行数相同的代码行数(16)!

这是应用了我们的样式调整的 Altair 图:

带有我们自定义样式的 Altair 绘图

图片来源:

具有我们自定义样式的 Altair 绘图 (© 2020Anvil)

结论

虽然使用 Altair 进行绘图所需的代码量与其他库相似,但它的声明性绘图语言增加了一层我已经逐渐欣赏的复杂性。 Altair 还提供了一种完全独立的方式来调整和调整样式,从而使该语法远离用于绘图的代码块。在考虑 Python 的绘图解决方案时,Altair 是另一个很棒的库。您可以在 Anvil](https://anvil.works/blog/plotting-in-pygal)(使用帐户)上以交互方式运行此代码[或在本地使用这个开源运行时。

---

本文基于Anvil的博客P抽签在Altair,经授权重复使用。

Logo

Python社区为您提供最前沿的新闻资讯和知识内容

更多推荐