如何更改 altair 中 geo_shape 的限制(python vega-lite)

Posted

技术标签:

【中文标题】如何更改 altair 中 geo_shape 的限制(python vega-lite)【英文标题】:How to change the limits for geo_shape in altair (python vega-lite) 【发布时间】:2019-06-22 00:23:12 【问题描述】:

我正在尝试使用 Altair 在 python 中绘制美国三个州的位置。我看到了关于美国地图的教程,但我想知道是否有办法将图像缩放到仅有的三个感兴趣的州,即纽约、新泽西和 CT。

目前,我有以下代码:

from vega_datasets import data            
states = alt.topo_feature(data.us_10m.url, 'states')

# US states background
background = alt.Chart(states).mark_geoshape(
    fill='lightgray',
    stroke='white',
    limit=1000
).properties(
    title='US State Capitols',
    width=700,
    height=400
).project("albers")
            
points=alt.Chart(accts).mark_point().encode(
        longitude = "longitude",
        latitude = "latitude",
        color = "Group")

background+points

我检查了 us_10m.url 数据集,似乎没有指定各个状态的字段。所以我希望我能以某种方式将背景的 xlim 和 ylim 更改为例如 [-80,-70] 和 [35,45]。我想放大到有数据点的区域(蓝点)。

有人能告诉我怎么做吗?谢谢!!

更新

JSON 文件中有一个名为 ID 的字段,我手动发现 NJ 是 34,NY 是 36,CT 是 9。有没有办法过滤这些 ID?这样就可以完成工作了!

【问题讨论】:

【参考方案1】:

好吧,似乎还不支持 geotype 的 selection/zoom/xlim/ylim 功能: Document and add warning that geo-position doesn't support selection yet #3305

所以我最终找到了一种解决这个问题的黑客方法,首先使用纯 python 基于 ID 进行过滤。基本上,将 JSON 文件加载到字典中,然后在将字典转换为 topojson 格式之前更改值字段。以下是 5 个州的示例,PA、NJ、NY、CT、RI 和 MA。

import altair as alt
from vega_datasets import data
# Load the data, which is loaded as a dict object
us_10m  = data.us_10m()
# Select the geometries under states under objects, filter on id (9,25,34,36,42,44)
us_10m['objects']['states']['geometries']=[item for item in us_10m['objects'] \
      ['states']['geometries'] if item['id'] in [9,25,34,36,42,44]]
# Make the topojson data
states = alt.Data(
    values=us_10m, 
    format=alt.TopoDataFormat(feature='states',type='topojson'))

# Plot background (now only has 5 states) 
background = alt.Chart(states).mark_geoshape(
    fill='lightgray',
    stroke='white',
    limit=1000
).properties(
    title='US State Capitols',
    width=700,
    height=400
).project("mercator")

# Plot the points
points=alt.Chart(accts).mark_circle(size=60).encode(
    longitude = "longitude",
    latitude = "latitude",
    color = "Group").project("mercator")

# Overlay the two plots
background+points

结果图看起来不错:

【讨论】:

以上是关于如何更改 altair 中 geo_shape 的限制(python vega-lite)的主要内容,如果未能解决你的问题,请参考以下文章

更改 Altair 图例中的形状颜色

如何在 Altair 中使用 GeoJSON 数据制作地图?

Altair - 如何在不操作 DataFrame 的情况下创建分组条形图

使用 Altair 和 Jupyter 绘图时如何在轴标签中显示希腊字母?

如何使 Altair 绘图响应

如何在 altair.layered 图中配置条形图?