当前位置:   article > 正文

Python数据可视化,被Altair圈粉了_python alchatos

python alchatos

今天的推文我们介绍一个功能很强,但知名度不如Matplotlib、pyecharts等静态或者交互式可视化库-Altair。Altair是基于Vega和Vega-Lite的Python数据统计可视化库,其优秀的交互、数据统计功能和清新的配色,很难让人用过就忘记(唯一不好就是名字太难记啦!)。今天,我们就系统介绍下Altair包的基本绘图流程。主要内容如下:

  • Altair绘图三大主要步骤
  • Altair样例

Altair绘图三大主要步骤

在绘制可视化作品之前,我们需要导入绘图所需的数据,Altair库的数据导入格式是标准的Pandas.Dataframe类型,这也很大程度上完善了Python 数据可视化流程化过程,省去了数据转换的过程。好了,介绍完所需要的数据类型,接下里就详细介绍Altair可视化主要的「三大步骤」

Chart Object)对象转换

在进行Altair可视化绘制时,我们要将之前读取的的数据转换成可被Altair接受的绘图对象,这时候,我们需要调用Altair库的Chart() 方法将数据转换成Altair的Chart对象。这一步骤也是必须和操作的,大家直接记住即可,下面是一个参考样例:

  1. import altair as alt
  2. chart = alt.Chart(data) # data为要绘制的数据,Dataframe类型

Encodings and Marks

在生成图表对象之后,就可以根据数据指定我们希望绘制的可视化作品啦。Altair库通过图表对象(Chart Object) 的 mark属性完成的,即可以通过Chart.mark_ *方法获取多种图表格式。如我们可以使用 mark_point() 来绘制点图,代码如下:

alt.Chart(data).mark_point()

除了mark_point()绘图函数外,Altair提供的其他表格类型如下表:

Chart.mark_ *

除此之外,Altair还提供给了组合图,即我们熟悉的统计类图表,如下:

Compound marks

当然,我最喜欢的一个绘图功能是下面这一个:直接填充图片(根据赋值的x、y坐标信息),就可以实现图片的填充效果图了,生成例如男女比例小头像的的统计图表就会更加立体形象,举例如下:

  1. import altair as alt
  2. import pandas as pd
  3. source = pd.DataFrame.from_records([
  4.       {"x"0.5"y"0.5"img""https://vega.github.io/vega-datasets/data/ffox.png"},
  5.       {"x"1.5"y"1.5"img""https://vega.github.io/vega-datasets/data/gimp.png"},
  6.       {"x"2.5"y"2.5"img""https://vega.github.io/vega-datasets/data/7zip.png"}
  7. ])
  8. alt.Chart(source).mark_image(
  9.     width=50,
  10.     height=50
  11. ).encode(
  12.     x='x',
  13.     y='y',
  14.     url='img'
  15. )

可视化结果如下:

mark_image example

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:705933274

要想对各类mark进行定制化操作,Altair也提供了大量可以进行定制化操作的Mark Properties (属性),除了比较常见的*颜色(color)、填充(fill)、大小(size)、透明度(opacity)、形状(shape)*外,还提供大量的其他属性,用于灵活构建自己的可视作品,更多详细的内容,小伙伴们可以参考其官网哈,如下:https://altair-viz.github.io/user_guide/marks.html

在选择完我们的mark对象后,接下来我们要做的就是如何将数据进行映射,比如,我绘制散点图,我需要将数据中的哪一列映射到X轴,哪一列映射到Y轴呢?这时候就需要用到Altair的Chart.encode() 方法。

Encode() 方法可直接将如坐标轴(x,y),颜色,形状,大小等图表属性通过pandas dataframes数据中的列名建立映射关系。比如下面这个例子就是将a列映射到X轴,b列y映射到Y轴的散点图:

  1. alt.Chart(data).mark_point().encode(
  2.     x='a',
  3.     y='b'
  4. )

更多encode()方法,大家可以参照以下网址进行了解:https://altair-viz.github.io/user_guide/encoding.html

在完成以上步骤后,你就可以使用Altair库进行基本图表的绘制了,当然,如果你想进行更加快速绘图(包括数据处理),Altair也提供了用于数据处理转换的Aggregation方法,该方法可以在绘制图表过程中直接对数据进行如求平均、求和等聚合数据操作。比如,还是上边的例子,我们希望将b列的均值映射到Y轴上,常规操作是先对数据进行转换计算再进行 可视化绘制,这里我们可以直接通过以下代码完成数据处理-绘图操作:

  1. alt.Chart(data).mark_bar().encode(
  2.     x='a',
  3.     y='average(b)'
  4. )

我们还可以通过以下方式来添加刻度轴名称、图例等绘图属性:

  1. alt.Chart(data).mark_bar(color='firebrick').encode(
  2.     alt.Y('a', title='category'),
  3.     alt.X('average(b)', title='avg(b) by category')
  4. )

其中:alt.Y、alt.X 方法则可以添加title、label等属性。

保存结果(Saving Altair Charts)

由于Altair为交互式的可视化库(基于JS),其保存绘制结果的格式也相对较多,这里我们列举一下即可:

  1. import altair as alt
  2. chart = alt.Chart(data.cars.url).mark_point().encode(
  3.     x='',
  4.     y='',
  5.     color=''
  6. )
  7. # 保存json格式
  8. chart.save('chart.json')
  9. # 保存HTML 网页格式
  10. chart.save('chart.html')
  11. # 保存png格式
  12. chart.save('chart.png')
  13. # 保存svg格式
  14. chart.save('chart.svg')
  15. # 保存pdf格式
  16. chart.save('chart.pdf')

其中保存png格式时还可以设置scale_factor属性,修改charts 大小或者分辨率,scale_factor默认大小为1.

chart.save('chart.png', scale_factor=2.0)

Altair样例

介绍完Altair基本的绘图步骤后,这一部分,我们列举几个优秀的可视化作品供大家欣赏。

「样例一」:London Tube Lines

  1. import altair as alt
  2. from vega_datasets import data
  3. boroughs = alt.topo_feature(data.londonBoroughs.url, 'boroughs')
  4. tubelines = alt.topo_feature(data.londonTubeLines.url, 'line')
  5. centroids = data.londonCentroids.url
  6. background = alt.Chart(boroughs).mark_geoshape(
  7.     stroke='white',
  8.     strokeWidth=2
  9. ).encode(
  10.     color=alt.value('#eee'),
  11. ).properties(
  12.     width=700,
  13.     height=500
  14. )
  15. labels = alt.Chart(centroids).mark_text().encode(
  16.     longitude='cx:Q',
  17.     latitude='cy:Q',
  18.     text='bLabel:N',
  19.     size=alt.value(8),
  20.     opacity=alt.value(0.6)
  21. ).transform_calculate(
  22.     "bLabel""indexof (datum.name,' ') > 0  ? substring(datum.name,0,indexof(datum.name, ' ')) : datum.name"
  23. )
  24. line_scale = alt.Scale(domain=["Bakerloo""Central""Circle""District""DLR",
  25.                                "Hammersmith & City""Jubilee""Metropolitan""Northern",
  26.                                "Piccadilly""Victoria""Waterloo & City" ],
  27.                        range=["rgb(137,78,36)""rgb(220,36,30)""rgb(255,206,0)",
  28.                               "rgb(1,114,41)""rgb(0,175,173)""rgb(215,153,175)",
  29.                               "rgb(106,114,120)""rgb(114,17,84)""rgb(0,0,0)",
  30.                               "rgb(0,24,168)""rgb(0,160,226)""rgb(106,187,170)"])
  31. lines = alt.Chart(tubelines).mark_geoshape(
  32.     filled=False,
  33.     strokeWidth=2
  34. ).encode(
  35.     alt.Color(
  36.         'id:N',
  37.         legend=alt.Legend(
  38.             title=None,
  39.             orient='bottom-right',
  40.             offset=0
  41.         )
  42.     )
  43. )
  44. background + labels + lines

可视化结果如下:

London Tube Lines

「样例二」:Natural Disasters

  1. import altair as alt
  2. from vega_datasets import data
  3. source = data.disasters.url
  4. alt.Chart(source).mark_circle(
  5.     opacity=0.8,
  6.     stroke='black',
  7.     strokeWidth=1
  8. ).encode(
  9.     alt.X('Year:O', axis=alt.Axis(labelAngle=0)),
  10.     alt.Y('Entity:N'),
  11.     alt.Size('Deaths:Q',
  12.         scale=alt.Scale(range=[04000]),
  13.         legend=alt.Legend(title='Annual Global Deaths')
  14.     ),
  15.     alt.Color('Entity:N', legend=None)
  16. ).properties(
  17.     width=450,
  18.     height=320
  19. ).transform_filter(
  20.     alt.datum.Entity != 'All natural disasters'
  21. )

可视化结果:

Natural Disasters

「样例三」:One Dot Per Zipcode

  1. import altair as alt
  2. from vega_datasets import data
  3. # Since the data is more than 5,000 rows we'll import it from a URL
  4. source = data.zipcodes.url
  5. alt.Chart(source).transform_calculate(
  6.     "leading digit", alt.expr.substring(alt.datum.zip_code, 01)
  7. ).mark_circle(size=3).encode(
  8.     longitude='longitude:Q',
  9.     latitude='latitude:Q',
  10.     color='leading digit:N',
  11.     tooltip='zip_code:N'
  12. ).project(
  13.     type='albersUsa'
  14. ).properties(
  15.     width=650,
  16.     height=400
  17. )

 

 

One Dot Per Zipcode

更多其他优秀的可视化作品,大家可前往altair官网进行查看

总结

今天我们介绍了一个优秀的Python交互式可视化包-Altair,其丰富的图表类型和灵活的定制化函数,相信一定能够让大家绘制出自己的可视化作品。以上内容只是简单对Altair包绘图过程进行了总结,主要都是我在使用该库进行绘图时所认为的关键步骤,可能有所缺漏,更多内容大家可参考Altair官网。

万水千山总是情,点个  行不行。

在这里还是要推荐下我自己建的Python学习Q群:705933274,群里都是学Python的,如果你想学或者正在学习Python ,欢迎你加入,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),包括我自己整理的一份2021最新的Python进阶资料和零基础教学,欢迎进阶中和对Python感兴趣的小伙伴加入!

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/230153
推荐阅读
相关标签
  

闽ICP备14008679号