Vega-Altair 数据规范详解:从基础到高级应用

Vega-Altair 数据规范详解:从基础到高级应用

altair Declarative statistical visualization library for Python altair 项目地址: https://gitcode.com/gh_mirrors/alt/altair

数据模型概述

Vega-Altair 采用表格数据模型作为其基础数据表示方式,类似于电子表格或数据库表的结构。每个数据集由多条记录(行)组成,每条记录包含多个命名字段(列)。这种结构化的数据组织形式为数据可视化提供了坚实的基础。

数据输入方式

Vega-Altair 支持多种数据输入方式,为开发者提供了极大的灵活性:

  1. Pandas DataFrame - 最常用的输入方式,Altair 会自动推断数据类型
  2. 支持DataFrame交换协议的对象 - 如Polars和PyArrow DataFrame(实验性功能)
  3. Data类对象 - 包括UrlData、InlineData、NamedData等专用数据类
  4. URL字符串 - 指向JSON或CSV格式文件的URL
  5. 地理空间数据 - 支持GeoPandas GeoDataFrame、Shapely几何对象、GeoJSON对象等
  6. 生成数据 - 数值序列或地理参考元素等

Pandas DataFrame 的独特优势

使用Pandas DataFrame作为数据源时,Altair能够自动推断字段的数据类型,这大大简化了可视化编码过程:

import altair as alt
import pandas as pd

data = pd.DataFrame({'x': ['A', 'B', 'C', 'D', 'E'],
                     'y': [5, 3, 6, 7, 2]})
alt.Chart(data).mark_bar().encode(
    x='x',  # 自动识别为分类数据
    y='y',  # 自动识别为定量数据
)

相比之下,其他数据输入方式需要显式声明数据类型:

data = alt.Data(values=[{'x': 'A', 'y': 5},
                        {'x': 'B', 'y': 3},
                        {'x': 'C', 'y': 6},
                        {'x': 'D', 'y': 7},
                        {'x': 'E', 'y': 2}])
alt.Chart(data).mark_bar().encode(
    x='x:N',  # 必须显式声明为名义数据
    y='y:Q',  # 必须显式声明为定量数据
)

数据处理技巧

处理索引数据

Altair默认只访问DataFrame的列数据,不包含索引。如需使用索引数据,可通过reset_index()方法将其转为列:

import numpy as np
rand = np.random.RandomState(0)

data = pd.DataFrame({'value': rand.randn(100).cumsum()},
                   index=pd.date_range('2018', freq='D', periods=100))

alt.Chart(data.reset_index()).mark_line().encode(
    x='index:T',  # 时间类型数据
    y='value:Q'
)

长格式与宽格式数据

Altair更适合处理长格式数据,其中每行代表一个观察值,所有元数据都存储在表值中。宽格式数据可以通过pandas的melt方法或Altair的折叠转换(fold transform)转为长格式:

使用pandas转换:

wide_form.melt('Date', var_name='company', value_name='price')

使用Altair转换:

alt.Chart(wide_form).transform_fold(
    ['AAPL', 'AMZN', 'GOOG'],
    as_=['company', 'price']
).mark_line().encode(
    x='Date:T',
    y='price:Q',
    color='company:N'
)

生成数据

Altair支持直接在图表规范中生成数据,减少对外部数据源的依赖:

序列生成器

data = alt.sequence(0, 10, 0.1, as_='x')
alt.Chart(data).transform_calculate(
    y='sin(datum.x)'
).mark_line().encode(
    x='x:Q',
    y='y:Q',
)

地理网格生成器

data = alt.graticule(step=[15, 15])
alt.Chart(data).mark_geoshape(stroke='black').project(
    'orthographic',
    rotate=[0, -45, 0]
)

地球球体生成器

sphere_data = alt.sphere()
grat_data = alt.graticule(step=[15, 15])

background = alt.Chart(sphere_data).mark_geoshape(fill='aliceblue')
lines = alt.Chart(grat_data).mark_geoshape(stroke='lightgrey')

alt.layer(background, lines).project('naturalEarth1')

地理空间数据处理

Altair支持多种地理空间数据格式,为地图可视化提供了强大支持:

GeoPandas GeoDataFrame

import geopandas as gpd
from shapely import geometry

data_geoms = [
    {"color": "#F3C14F", "geometry": geometry.Polygon(...)},
    # 更多几何体...
]

gdf_geoms = gpd.GeoDataFrame(data_geoms)
alt.Chart(gdf_geoms).mark_geoshape().encode(
    alt.Color("color:N").scale(None)
).project(type="identity", reflectY=True)

GeoJSON数据

支持内联GeoJSON对象或通过URL加载远程GeoJSON文件:

# 内联GeoJSON
data_obj_geojson = alt.Data(values=obj_geojson, format=alt.DataFormat(property="features"))
alt.Chart(data_obj_geojson).mark_geoshape().encode(
    alt.Color("properties.location:O").scale(scheme='magma')
)

# 远程GeoJSON
url_geojson = "https://example.com/data.geojson"
data_url_geojson = alt.Data(url=url_geojson, format=alt.DataFormat(property="features"))
alt.Chart(data_url_geojson).mark_geoshape().encode(color='properties.continent:N')

TopoJSON数据

TopoJSON通过共享弧段减少数据大小,适合处理大型地理数据集:

obj_topojson = {
    "arcs": [...],
    "objects": {
        "MY_DATA": {
            "geometries": [...]
        }
    }
}
data_topojson = alt.Data(values=obj_topojson, 
                        format=alt.DataFormat(type="topojson", feature="MY_DATA"))

通过掌握这些数据规范和处理技巧,您可以在Vega-Altair中高效地实现各种复杂的数据可视化需求。

altair Declarative statistical visualization library for Python altair 项目地址: https://gitcode.com/gh_mirrors/alt/altair

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平钰垚Zebediah

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值