社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Python开发者 • 5 年前 • 954 次点击  

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

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

Altair绘图三大主要步骤

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

Chart Object)对象转换

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

import altair as alt
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坐标信息),就可以实现图片的填充效果图了,生成例如男女比例小头像的的统计图表就会更加立体形象,举例如下:

import altair as alt
import pandas as pd

source = pd.DataFrame.from_records([
      {"x": 0.5, "y": 0.5, "img""https://vega.github.io/vega-datasets/data/ffox.png"},
      {"x": 1.5, "y": 1.5, "img""https://vega.github.io/vega-datasets/data/gimp.png"},
      {"x": 2.5, "y": 2.5, "img""https://vega.github.io/vega-datasets/data/7zip.png"}
])

alt.Chart(source).mark_image(
    width=50,
    height=50
).encode(
    x='x',
    y='y',
    url='img'
)

可视化结果如下:

mark_image example

要想对各类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轴的散点图:

alt.Chart(data).mark_point().encode(
    x='a',
    y='b'
)

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

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

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

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

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

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

保存结果(Saving Altair Charts)

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

import altair as alt

chart = alt.Chart(data.cars.url).mark_point().encode(
    x='',
    y='',
    color=''
)
# 保存json格式
chart.save('chart.json')
# 保存HTML 网页格式
chart.save('chart.html')
# 保存png格式
chart.save('chart.png')
# 保存svg格式
chart.save('chart.svg')
# 保存pdf格式
chart.save('chart.pdf')

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

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

Altair样例

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

「样例一」:London Tube Lines

import altair as alt
from vega_datasets import data

boroughs = alt.topo_feature(data.londonBoroughs.url, 'boroughs')
tubelines = alt.topo_feature(data.londonTubeLines.url, 'line')
centroids = data.londonCentroids.url

background = alt.Chart(boroughs).mark_geoshape(
    stroke='white',
    strokeWidth=2
).encode(
    color=alt.value('#eee'),
).properties(
    width=700,
    height=500
)

labels = alt.Chart(centroids).mark_text().encode(
    longitude='cx:Q',
    latitude='cy:Q',
    text='bLabel:N',
    size=alt.value(8),
    opacity=alt.value(0.6)
).transform_calculate(
    "bLabel""indexof (datum.name,' ') > 0  ? substring(datum.name,0,indexof(datum.name, ' ')) : datum.name"
)

line_scale = alt.Scale(domain=["Bakerloo""Central""Circle""District""DLR",
                               "Hammersmith & City""Jubilee""Metropolitan""Northern",
                               "Piccadilly""Victoria""Waterloo & City" ],
                       range=["rgb(137,78,36)""rgb(220,36,30)""rgb(255,206,0)",
                              "rgb(1,114,41)""rgb(0,175,173)""rgb(215,153,175)",
                              "rgb(106,114,120)""rgb(114,17,84)""rgb(0,0,0)",
                              "rgb(0,24,168)""rgb(0,160,226)""rgb(106,187,170)"])

lines = alt.Chart(tubelines).mark_geoshape(
    filled=False,
    strokeWidth=2
).encode(
    alt.Color(
        'id:N',
        legend=alt.Legend(
            title=None,
            orient='bottom-right',
            offset=0
        )
    )
)

background + labels + lines

可视化结果如下:

London Tube Lines

「样例二」:Natural Disasters

import altair as alt
from vega_datasets import data

source = data.disasters.url

alt.Chart(source).mark_circle(
    opacity=0.8,
    stroke='black',
    strokeWidth=1
).encode(
    alt.X('Year:O', axis=alt.Axis(labelAngle=0)),
    alt.Y('Entity:N'),
    alt.Size('Deaths:Q',
        scale=alt.Scale(range=[0, 4000]),
        legend=alt.Legend(title='Annual Global Deaths')
    ),
    alt.Color('Entity:N', legend=None)
).properties(
    width=450,
    height=320
).transform_filter(
    alt.datum.Entity != 'All natural disasters'
)

可视化结果:

Natural Disasters

「样例三」:One Dot Per Zipcode

import altair as alt
from vega_datasets import data

# Since the data is more than 5,000 rows we'll import it from a URL
source = data.zipcodes.url

alt.Chart(source).transform_calculate(
    "leading digit", alt.expr.substring(alt.datum.zip_code, 0, 1)
).mark_circle(size=3).encode(
    longitude='longitude:Q',
    latitude='latitude:Q',
    color='leading digit:N',
    tooltip='zip_code:N'
).project(
    type='albersUsa'
).properties(
    width=650,
    height=400
)


One Dot Per Zipcode

更多其他优秀的可视化作品,大家可前往altair官网进行查看:https://altair-viz.github.io/gallery/index.html

总结

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


- EOF -

推荐阅读  点击标题可跳转

1、盘点 Django 展示可视化图表的多种方式(建议收藏)

2、Charts.css:一个数据可视化开源神器

3、Rhit:高效可视化 Nginx 日志查看工具,每秒处理百万行日志数据


觉得本文对你有帮助?请分享给更多人

推荐关注「Python开发者」,提升Python技能


点赞和在看就是最大的支持❤️

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/113493