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

时间:2019-01-28 22:55:37

标签: python-3.x geojson vega-lite altair

我正在尝试使用Altair在python中绘制美国三个州的位置。我看过有关美国地图的教程,但我想知道是否有将图像缩放到仅三个感兴趣的状态,即NY,NJ和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]。我想放大到有数据点(蓝点)的区域。

有人可以告诉我该怎么做吗?谢谢!

enter image description here

更新

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

1 个答案:

答案 0 :(得分:1)

好吧,似乎不支持地理类型的选择/缩放/ xlim / ylim功能: Document and add warning that geo-position doesn't support selection yet #3305

因此,我最终采用了一种骇人听闻的方式来解决此问题,方法是首先使用纯python根据ID进行过滤。基本上,将JSON文件加载到字典中,然后在将字典转换为topojson格式之前更改value字段。以下是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

生成的图看起来还可以:

enter image description here