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图需要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
。 这就是您用语言描述它的方式,而这正是代码中所说的!
这是情节的样子:
调整样式
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进行绘图所需的代码量与其他库相似,但其声明性绘图语言增加了一层我已逐渐意识到的复杂性。 Altair还提供了一种完全独立的方法来调整和调整样式,从而使该语法不受用于绘图的代码块的影响。 考虑使用Python的绘图解决方案时,Altair是另一个很棒的库。 您可以在Anvil (使用帐户) 上交互式运行此代码,也可以使用此开源运行时本地运行 。
---
本文基于Anvil博客上Altair中的 P 抽签,并经允许重复使用。
翻译自: https://opensource.com/article/20/6/altair-python
altair 8800