在 Python 中使用 Altair 进行简洁的数据绘图
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 图(© 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 中。我们也想把color按party吧。这就是你用文字描述它的方式,这正是代码所说的!
这是情节的样子:

图片来源:
具有默认样式的 Altair 绘图(© 2020Anvil)
调整样式
更多 Python 资源
-
什么是IDE?
-
备忘单:适用于初学者的 Python 3.7
-
顶级 Python GUI 框架
-
下载:7 个必不可少的 PyPI 库
-
红帽开发者
-
最新 Python 内容
这离我们想要的并不远。与 Matplotlib 绘图的主要区别在于,每个 Altairyear组的显示中间都有一点空白——这只是 Altair 多条形图的一个特点,这不是问题。
但是,我们确实想要进行其他一些小的样式改进。
非整数值
两个非整数年份名称(Feb 1974和Oct 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 绘图 (© 2020Anvil)
结论
虽然使用 Altair 进行绘图所需的代码量与其他库相似,但它的声明性绘图语言增加了一层我已经逐渐欣赏的复杂性。 Altair 还提供了一种完全独立的方式来调整和调整样式,从而使该语法远离用于绘图的代码块。在考虑 Python 的绘图解决方案时,Altair 是另一个很棒的库。您可以在 Anvil](https://anvil.works/blog/plotting-in-pygal)(使用帐户)上以交互方式运行此代码[或在本地使用这个开源运行时。
---
本文基于Anvil的博客P抽签在Altair,经授权重复使用。
更多推荐

所有评论(0)