返回

如何在Altair/Vega-Lite中拼接独立坐标轴的地理图形?

python

如何在 Altair / Vega-Lite 中拼接两个独立坐标轴的地理图形图表?

在数据可视化中,地理图形图表是展示空间数据的重要工具。当我们需要对比分析不同地区的地理数据时,常常需要将多个地理图形图表拼接在一起。Altair,建立在强大的 Vega-Lite 语法之上,为创建美观且信息丰富的可视化图表提供了便捷的接口。然而,在 Altair / Vega-Lite 中拼接两个具有独立坐标轴的地理图形图表时,会遇到坐标轴范围共享的问题,导致图表显示不如预期。本文将详细介绍如何解决这一问题,并提供可供参考的代码示例。

问题分析

假设我们希望将美国两个不同地区的地理图形图表并排展示,以突出显示 ID 为 '49047' 和 '20123' 的两个区域。我们使用 Altair 和 Vega-Lite 进行绘图,代码如下:

import altair as alt
from vega_datasets import data
import geopandas as gpd

source = data.us_10m
source = gpd.read_file(source.url).set_crs(epsg=4326)

r1 = alt.Chart(source).mark_geoshape().transform_filter(alt.datum.id == '49047')
r2 = alt.Chart(source).mark_geoshape().transform_filter(alt.datum.id == '20123')

r1 | r2

这段代码分别生成了两个区域的地理图形图表,并尝试将它们水平拼接。但是,拼接后的图表并没有达到我们预期的效果,两个图表的坐标轴共用相同的范围,导致每个图表的视图都扩展到足以容纳两个区域,即使只有一个区域实际显示出来。

解决方案解析

问题的根源在于 Altair 和 Vega-Lite 默认会自动计算投影方式以适应所有数据。想要解决这个问题,我们需要为每个图表分别指定独立的投影方式。 具体来说,我们可以通过在每个图表的 projection 参数中设置 type'albersUsa' 来强制使用美国阿尔伯斯投影,并分别设置 scaletranslate 参数来精确定位每个图表的显示范围。

修改后的代码如下:

r1 = alt.Chart(source).mark_geoshape().transform_filter(
    alt.datum.id == '49047'
).project(
    type='albersUsa',
    scale=1200,
    translate=[100, 200]
)

r2 = alt.Chart(source).mark_geoshape().transform_filter(
    alt.datum.id == '20123'
).project(
    type='albersUsa',
    scale=1200,
    translate=[400, 200]
)

r1 | r2

通过为每个图表设置独立的 albersUsa 投影,并微调 scaletranslate 参数,我们可以将两个图表分别调整到合适的位置和大小,最终实现拼接后的图表各自拥有独立的坐标轴范围。

深入理解

  • projection: projection 参数是控制地理数据如何在二维平面上进行投影的关键。Altair/Vega-Lite 提供了多种投影方式,例如 'albersUsa''mercator''equirectangular' 等等。选择合适的投影方式取决于数据的特性和可视化目标。

  • scale: scale 参数控制着地图的缩放比例。数值越大,地图的缩放级别越高,显示的地理范围越小。

  • translate: translate 参数控制着地图在水平和垂直方向上的平移。通过调整 translate 参数,我们可以将地图精确定位到 desired 的位置。

常见问题解答

  1. 除了 'albersUsa',还有哪些常用的地图投影方式?

    除了 'albersUsa',其他常用的地图投影方式还包括:

    • mercator:适用于导航和显示经线与纬线呈直角的地图。
    • equirectangular:也称为等距圆柱投影,经线和纬线都投影成等距的平行线。
    • conicEqualArea:适用于显示中纬度地区,面积比例准确。
    • orthographic:从一个特定的视角点来观察地球,类似于从太空中看地球。
  2. 如何选择合适的 scaletranslate 参数值?

    scaletranslate 参数的最佳值取决于数据的具体情况,需要通过反复尝试来找到最佳的视觉效果。

  3. 除了水平拼接,Altair/Vega-Lite 是否支持垂直拼接?

    是的, Altair/Vega-Lite 支持使用 & 操作符进行垂直拼接。例如, r1 & r2 会将 r1r2 两个图表垂直拼接在一起。

  4. 如何为拼接后的图表添加标题和图例说明?

    可以使用 alt.Chart.properties() 方法为拼接后的图表添加标题。例如,(r1 | r2).properties(title="美国两个区域对比")。可以使用 alt.Chart.configure_title() 方法设置标题的样式。

  5. 如何自定义地理图形图表的颜色和其他样式?

    可以使用 alt.Chart.mark_geoshape() 方法中的参数,或使用 alt.Chart.encode() 方法来设置地理图形图表的颜色、边框和其他样式属性。

总结

本文详细介绍了如何在 Altair/Vega-Lite 中拼接两个具有独立坐标轴的地理图形图表,并提供了代码示例和常见问题解答。 通过掌握这些技巧,您可以更加灵活地使用 Altair/Vega-Lite 创建信息丰富、视觉 appealing 的地理数据可视化作品。