Plotly:如何为 Scattergeo 设置手动边界框?

Plotly: How to set a manual bounding box for a Scattergeo?

我正在尝试计算 U.S 中的平均人口中心。对于各种变量,所以我的第一步是按县计算过去 10 年的人口,看看它们是否与这个数字的 Census maps 相匹配(至少是粗略的,因为人口普查使用的是更精细的地理分辨率。)如您所料,这是一种极度延迟的天定命运:

(根据许多人口中心计算这些点的公式是on page 2 here,如果有人好奇的话。)

我正在从 R/RStudio 迁移到 Jupyter,使用 pandas、plotly、numpy 等。我通常是一名 JavaScript 工程师,但我对 Python 并且比 R 更喜欢它!使用此 fantastic tutorial on plotly.graph_objects.Scattergeo 中的机场地图示例,我能够计算出看似相似的点,但我被困在国家决议中,所以我无法判断我的表现如何:

当然,我可以手动缩放,但我真的很想了解如何默认只关注密苏里州。我找到了这个 useful CodePen,但是由于 Python 中有很多不同的优秀映射工具,我不确定如何移植 JS。

我目前的地图,基于上面的教程,设置了基本图,然后在第二行修改了布局的范围——我不确定这是否是 plotly 的标准,或者只是方便。

尽管我很钦佩 Python,但直接查看 update_layout 的文档有点麻烦 :) 我不介意规定 lat/lng 的范围视口,尽管只说“密苏里州”会很整洁。我意识到这很简单 -- 只是一点点学习曲线。

import pandas as pd
import plotly.graph_objects as go

meanCenters = pd.read_json('{"year": {"0": 2010, "1": 2011, "2": 2012, "3": 2013, "4": 2014, "5": 2015, "6": 2016, "7": 2017, "8": 2018, "9": 2019}, "lat": {"0": 37.52908501121699, "1": 37.51719645600817, "2": 37.50264465332917, "3": 37.489564543614605, "4": 37.47311004581999, "5": 37.45358003505096, "6": 37.43623735876329, "7": 37.423475510154134, "8": 37.4121869670822, "9": 37.40021167050047}, "lng": {"0": -92.1522086893934, "1": -92.17800419530532, "2": -92.20484620692078, "3": -92.23312370193283, "4": -92.26617930383293, "5": -92.30498885605378, "6": -92.3395596061908, "7": -92.36398254029461, "8": -92.38362683728195, "9": -92.40337680455285}}')

fig = go.Figure(data=go.Scattergeo(
    lon = meanCenters['lng'],
    lat = meanCenters['lat'],
    mode = 'markers'
))
fig.update_layout(
    geo_scope='usa',
    height=600
)
fig.show()

数据包含在上面——谢谢,@vestland! -- 但出于可读性考虑转载于此

year    lat lng
2010    37.52908501121699   -92.1522086893934
2011    37.51719645600817   -92.17800419530532
2012    37.50264465332917   -92.20484620692078
2013    37.489564543614605  -92.23312370193283
2014    37.47311004581999   -92.26617930383293
2015    37.45358003505096   -92.30498885605378
2016    37.43623735876329   -92.3395596061908
2017    37.423475510154134  -92.36398254029461
2018    37.4121869670822    -92.38362683728195
2019    37.40021167050047   -92.40337680455285

我还没有找到一种方法来指定如何直接显示 Missouri 等地理区域,但是您 可以 指定如何使用以下方法关注您的数据:

fig.update_geos(fitbounds='locations')

你的数据样本会给你这个:

因此,这种简单的方法对于包含更大的美国地图的更大的数据集更有意义。但这里有一个非常好的事情是,您可以使用 px.Line() 构建您的图形,然后使用例如:

添加到该图形中
fig.add_traces(go.Scattergeo(lat=[41,36], lon=[-96,-89]

而这些坐标恰好使地图的轮廓包括 Missouri,所以你会得到这个(标记设置为 100% 透明):

如果我对您的理解正确,这或多或少就是您要找的东西? 也许这个建议的最佳收获是您可以使用 px.express 构建图形,使用 fig.add_traces(go.Scattergeo()) 添加数据,然后使用 fig.update_geos() 而不仅仅是 [=19] 编辑地理特征=].

这是重现第二个数字的完整代码片段:

import plotly.express as px
import plotly.graph_objects as go
meanCenters = pd.read_json('{"year": {"0": 2010, "1": 2011, "2": 2012, "3": 2013, "4": 2014, "5": 2015, "6": 2016, "7": 2017, "8": 2018, "9": 2019}, "lat": {"0": 37.52908501121699, "1": 37.51719645600817, "2": 37.50264465332917, "3": 37.489564543614605, "4": 37.47311004581999, "5": 37.45358003505096, "6": 37.43623735876329, "7": 37.423475510154134, "8": 37.4121869670822, "9": 37.40021167050047}, "lng": {"0": -92.1522086893934, "1": -92.17800419530532, "2": -92.20484620692078, "3": -92.23312370193283, "4": -92.26617930383293, "5": -92.30498885605378, "6": -92.3395596061908, "7": -92.36398254029461, "8": -92.38362683728195, "9": -92.40337680455285}}')

fig = px.line_geo(lat=meanCenters['lat'], lon=meanCenters['lng'])

fig.add_traces(go.Scattergeo(lat=[41,36], lon=[-96,-89],
                             mode = 'markers',
                             marker = dict(size = 2,color = 'rgba(0, 0, 0, 0)'),
                             name='Missouri'))

fig.update_geos(visible=True, resolution=50, scope="north america",
                fitbounds='locations',
                showcountries=True, countrycolor="Black",
                showsubunits=True, subunitcolor="grey")

fig.show()