Altair作为Python数据映射库,提供了优雅的界面和自己的绘图语言。Python中的绘图库提供了多种方式来呈现数据以满足您的不同偏好,例如灵活性、布局、易用性或特殊样式。我发现Altair提供了与其他解决方案不同的解决方案,并且总体上更易于使用。得益于声明式绘图语言Vega,Altair拥有优雅的界面,可以直接定义要绘制的图片应该是什么样子,而不是通过编写大量循环和条件判断来逐步构建。绘图过程我通过绘制相同的多条形图来比较多个Python绘图库之间的差异。在正式开始之前,您需要将您的Python环境调整到可以运行以下代码的状态。具体:安装最新版本的Python(Linux、Mac、Windows系统下的安装方法)确认这个版本的Python可以运行本教程使用的库演示资料可以从网上下载,直接用pandas导入即可:importpandasaspddf=pd.read_csv('https://anvil.works/blog/img/plotting-in-python/uk-election-results.csv')准备就绪。为了做个对比,先看下面这张用Matplotlib做的图:Matplotlib英国大选结果用Matplotlib需要16行代码,bar的位置需要自己计算。使用Altair绘制类似的图表,代码如下:importaltairasaltchart=alt.Chart(df).mark_bar().encode(x='party',y='seats',column='year',color='party',)chart.save('altair-elections.html')更加简洁!与Seaborn类似,Altair使用的数据按每个变量一列(即数据列)进行组织。这样每个变量都可以映射到图形的属性——Altair称之为“通道”。在上面的示例中,我们希望每个“派对”在x轴上显示为一组列,其“座位”在y轴上显示,列被分隔为“列”年”。我们还想根据“派对”为酒吧使用不同的“颜色”。用语言表达需求就像上面这样,而这正是代码想要表达的!现在绘制图片:Altairplotwithdefaultstyling调整样式这有点接近我们预期的效果。与Matplotlib方案相比,主要区别是在Altair方案中,在显示每个年份组时,它们之间有一个小的差距——这不是问题,这只是Altair多条形图显示的一个特性。所以,还是需要对显示样式做一些改进。对于非整数数据,两个非整数年份名称(Feb1974和Oct1974)显示为NaN。这可以通过将年份值year转换为字符串来解决:df['year']=df['year'].astype(str)指定数据排序方式也需要让Altair知道如何对数据进行排序。Altair允许通过传递Column对象来设置Column通道的更多细节。现在让Altair按照数据在数据集中出现的顺序对数据进行排序:chart=alt.Chart(df).mark_bar().encode(#...column=alt.Column('year',sort=list(df['year']),title=None),#...)删除轴标签我们通过设置title=None删除了绘图顶部的“年”标签。这是每列数据的另一个“派对”标签:chart=alt.Chart(df).mark_bar().encode(x=alt.X('party',title=None),#...)指定color在图的最后,我们还想自己指定列的颜色。Altair允许在域中的值和范围中的颜色之间建立一个映射来实现想要的功能,非常贴心:cmap={'Conservative':'#0343df','Labour':'#e50000','自由':'#ffff14','其他':'#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()的对象中来控制显示效果:importaltairasaltfromvotesimportlongasdfcmap={'Conservative':'#0343df','Labour':'#e50000','Liberal':'#ffff14','Others':'#929591',}df['year']=df['year'].astype(str)#我们还在赋值,例如'party'到x,但现在我们将它包装在alt.X中以指定其样式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')nowequalsMatplotlibscheme是的,代码数量有达到了16行!下图是使用我们的样式调整方案后的Altair渲染图:Altairplotwithourcustomstyling结论虽然在代码数量上使用Altair绘图没有优势,但其声明式绘图语言使层的操作更加精确,我更欣赏。Altair还提供了一种清晰且独立的方式来调整显示样式,从而将相关代码与绘图代码块分开。Altair确实是另一个很棒的Python绘图库。
