Chr*_*son 5 python mapping bounding-box plotly
我正在尝试计算美国各种变量的平均人口中心,因此我的第一步是按县计算过去 10 年的人口,看看它们是否与该图的人口普查地图相匹配(至少粗略地说,因为人口普查使用的是更精细的地理分辨率。)正如你所期望的,这是一种极度延迟的昭昭命运:
(如果有人好奇的话,根据许多人口中心计算这些点的公式位于此处的第 2 页。)
我正在从 R/RStudio 迁移到 Jupyter,使用 pandas、plotly、numpy 等。我通常是一名 JavaScript 工程师,但我对 Python 很满意,并且比 R 更喜欢它!我能够使用上这个精彩教程plotly.graph_objects.Scattergeo中的机场地图示例来计算看似相似的点,但我陷入了国家分辨率,所以我无法告诉我做得有多好:
当然,我可以手动缩放,但我真的很想了解如何默认仅关注密苏里州。我发现这个很有用的 CodePen,但是由于 Python 中有很多不同的优秀映射工具,我不确定如何移植 JS。
我当前的地图基于上述教程,设置了基本绘图,然后在第二行中修改布局的范围 - 我不确定这是否是 的标准plotly,或者只是为了方便。
尽管我很欣赏 Python,但直接查看文档update_layout有点像兔子洞:) 我不介意指定视口的纬度/经度边界,尽管直接说“密苏里州”会很整洁。我意识到这很简单——只是需要一点学习曲线。
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()
Run Code Online (Sandbox Code Playgroud)
数据包含在上面——谢谢,@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
Run Code Online (Sandbox Code Playgroud)
我还没有找到一种方法来指定如何Missouri直接显示地理区域,但您可以使用以下方法指定如何关注数据:
fig.update_geos(fitbounds='locations')
Run Code Online (Sandbox Code Playgroud)
对于您的数据样本,这将为您提供:
因此,这种简单的方法对于包含更大的美国地图的较大数据集更有意义。但这里的一个非常好的事情是,您可以使用以下方法构建图形px.Line(),然后使用以下方法添加到该图形中,例如:
fig.add_traces(go.Scattergeo(lat=[41,36], lon=[-96,-89]
Run Code Online (Sandbox Code Playgroud)
这些坐标恰好使地图的轮廓包含Missouri,所以你会得到这个(标记设置为 100% 透明):
如果我没理解错的话,这或多或少就是你想要的?也许这个建议的最佳收获是,您可以使用 using 构建图形px.express,使用 添加数据fig.add_traces(go.Scattergeo()),然后使用 和 编辑地理特征fig.update_geos(),而不仅仅是fig.update_layout()。
这是重现第二个图的完整代码片段:
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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3147 次 |
| 最近记录: |