Vega-Altair 数据规范详解:从基础到高级应用
数据模型概述
Vega-Altair 采用表格数据模型作为其基础数据表示方式,类似于电子表格或数据库表的结构。每个数据集由多条记录(行)组成,每条记录包含多个命名字段(列)。这种结构化的数据组织形式为数据可视化提供了坚实的基础。
数据输入方式
Vega-Altair 支持多种数据输入方式,为开发者提供了极大的灵活性:
- Pandas DataFrame - 最常用的输入方式,Altair 会自动推断数据类型
- 支持DataFrame交换协议的对象 - 如Polars和PyArrow DataFrame(实验性功能)
- Data类对象 - 包括UrlData、InlineData、NamedData等专用数据类
- URL字符串 - 指向JSON或CSV格式文件的URL
- 地理空间数据 - 支持GeoPandas GeoDataFrame、Shapely几何对象、GeoJSON对象等
- 生成数据 - 数值序列或地理参考元素等
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中高效地实现各种复杂的数据可视化需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考