altair 8800
Python中可用的绘图库提供了多种根据您的喜好显示数据的方法,无论您是灵活性,设计,易用性还是特定样式。
Altair中的绘图提供了与其他解决方案不同的解决方案,我发现这比绘制完成的比例更简单。 感谢Vega (声明性绘图语言),它具有一个优雅的界面,该语言使您可以定义绘图的外观,而不用编写循环和条件语句来构造它们。
流利的绘图
我通过绘制相同的多栏图来比较每个Python绘图库。 在继续之前,请注意,您可能需要调整Python环境以使此代码运行,包括以下内容。
- 安装最新版本的Python( Linux , Mac和Windows的说明 )
- 验证Python版本是否与本教程中使用的库兼容
数据可在线获得,并可使用熊猫导入:
import pandas
as pd
df
= pd.
read_csv
(
'https://anvil.works/blog/img/plotting-in-python/uk-election-results.csv'
)
现在我们准备出发了。 作为比较,这是我们在Matplotlib中绘制的图:
![Matplotlib英国大选结果 Matplotlib UK election results](https://i-blog.csdnimg.cn/blog_migrate/8db9c84243daec55c0d1679ca9140294.png)
Matplotlib图需要16行代码来创建,包括手动计算每个条的位置。
这是在Altair中进行类似绘制的方法:
import altair
as alt
chart
= alt.
Chart
( df
) .
mark_bar
(
) .
encode
(
x
=
'party'
,
y
=
'seats'
,
column
=
'year'
,
color
=
'party'
,
)
chart.
save
(
'altair-elections.html'
)
更简洁! 与Seaborn一样,Altair处理的数据每个变量只有一列( Long Form )。 这使您可以将每个变量映射到绘图的某个方面,Altair称这些方面为“通道”。 在我们的示例中,我们希望每个party
在x
轴上有一个小节,我们希望每个方在y
轴上获胜的seats
,并且希望将这些小节按year
分组到s column
。 我们也想按party
给color
。 这就是您用语言描述它的方式,而这正是代码中所说的!
这是情节的样子:
![具有默认样式的Altair图 Altair plot with default styling](https://i-blog.csdnimg.cn/blog_migrate/743747d5c1b8b97535aaba13aef97c71.png)
调整样式
year
组显示在中间,中间有一点空白-这只是Altair多栏图的一个功能,这不是问题。
但是,我们确实要进行其他一些小的样式改进。
非整数值
两个非整数年份名称( Feb 1974
和Oct 1974
Feb 1974
Oct 1974
)显示为NaN
。 我们可以通过将year
值转换为字符串来解决这些问题:
df [ 'year' ] = df [ 'year' ] . astype ( str )
指定排序顺序
然后,我们还需要告诉Altair如何对数据进行排序。 Altair允许我们通过向其传递Column
对象来指定有关column
通道的更多详细信息。 因此,我们告诉它按照数据在DataFrame中出现的顺序进行排序:
chart
= alt.
Chart
( df
) .
mark_bar
(
) .
encode
(
# ...
column
= alt.
Column
(
'year'
, sort
=
list
( df
[
'year'
]
)
, title
=
None
)
,
# ...
)
删除轴标题
我们通过设置title=None
从图的顶部删除了“ year”标签。 我们还从每个列中删除“ party”标签:
chart
= alt.
Chart
( df
) .
mark_bar
(
) .
encode
(
x
= alt.
X
(
'party'
, title
=
None
)
,
# ...
)
指定色彩图
最后,我们要指定自己的颜色以用于条形图。 Altair使我们可以指定domain
值和range
颜色之间的映射,这正是我们所需要的:
cmap
=
{
'Conservative' :
'#0343df'
,
'Labour' :
'#e50000'
,
'Liberal' :
'#ffff14'
,
'Others' :
'#929591'
,
}
chart
= alt.
Chart
( df
) .
mark_bar
(
) .
encode
(
# ...
color
= alt.
Color
(
'party'
, scale
= alt.
Scale
( domain
=
list
( cmap.
keys
(
)
)
,
range
=
list
( cmap.
values
(
)
)
)
)
)
带有样式调整的最终代码
在应用了这些样式调整之后,我们的代码看起来就不那么令人愉快了,但是它仍然使用使Altair如此可伸缩的声明性方法。 我们仍然将数据中的自变量分配给绘图的各个方面,而不是像在Matplotlib中通常需要执行的那样执行复杂的数据操作。 唯一的区别是,变量名现在被包裹在alt.X()
这样的对象中,这些对象使我们可以调整它们的显示方式:
import altair
as alt
from votes
import
long
as df
cmap
=
{
'Conservative' :
'#0343df'
,
'Labour' :
'#e50000'
,
'Liberal' :
'#ffff14'
,
'Others' :
'#929591'
,
}
df
[
'year'
]
= df
[
'year'
] .
astype
(
str
)
# We're still assigning, e.g. 'party' to x, but now we've wrapped it
# in alt.X in order to specify its styling
chart
= alt.
Chart
( df
) .
mark_bar
(
) .
encode
(
x
= alt.
X
(
'party'
, title
=
None
)
,
y
=
'seats'
,
column
= alt.
Column
(
'year'
, sort
=
list
( df
[
'year'
]
)
, title
=
None
)
,
color
= alt.
Color
(
'party'
, scale
= alt.
Scale
( domain
=
list
( cmap.
keys
(
)
)
,
range
=
list
( cmap.
values
(
)
)
)
)
)
chart.
save
(
'altair-elections.html'
)
公平地说,与Matplotlib一样,我们现在达到的代码行数(16)与此处使用的相同!
这是应用了样式调整的Altair图:
![带有我们自定义样式的Altair图。 The Altair plot with our custom styling](https://i-blog.csdnimg.cn/blog_migrate/bc16d9106caa8e967e016e0d7a0e7505.png)
结论
尽管使用Altair进行绘图所需的代码量与其他库相似,但其声明性绘图语言增加了一层我已逐渐意识到的复杂性。 Altair还提供了一种完全独立的方法来调整和调整样式,从而使该语法不受用于绘图的代码块的影响。 考虑使用Python的绘图解决方案时,Altair是另一个很棒的库。 您可以在Anvil (使用帐户) 上交互式运行此代码,也可以使用此开源运行时本地运行 。
---
本文基于Anvil博客上Altair中的 P 抽签,并经允许重复使用。
altair 8800