Eth*_*han 5 plot matplotlib dataframe pandas geopandas
我正在开展一个项目,其中使用形状文件来制作美国的分区统计图。为此,我从美国人口普查局下载了标准形状文件。经过一些清理(有一些无关的岛屿区域,我通过更改绘图的轴限制来删除它们),我能够使连续的状态完全符合 matplotlib 图形的边界。作为参考,请参阅下面的编辑 4。
编辑 1:我正在使用cb_2018_us_state_500k.zip [3.2 MB]形状文件。
现在唯一的问题是,通过设置轴限制,我现在无法再查看阿拉斯加和夏威夷(因为这些显然是通过限制轴限制而被删除的)。我现在想将这两个多边形添加回我的地图中,但现在朝向绘图的下部(大多数其他此类地图给出的处理方式),尽管其地理不准确。
更具体地说,我有兴趣选择代表阿拉斯加和夏威夷的多边形形状并将它们移动到我的图形的左下侧。这是可能的事吗?
我可以使用以下方法创建布尔掩码:
mask = df['STUSPS'] == 'AK'
Run Code Online (Sandbox Code Playgroud)
单独获取该状态的多边形;然而,我现在有点困惑如何移动它/重新定位它。
编辑 2:由于每个状态都由 dtype 表示geometry,我是否可以对多边形中的每个点应用变换?对于阿拉斯加,几何列显示:
27 MULTIPOLYGON (((179.48246 51.98283, 179.48656 ...
Name: geometry, dtype: geometry
Run Code Online (Sandbox Code Playgroud)
是否可以说将此列表中的每个数字乘以相同的常数即可完成此操作?
我想将阿拉斯加放在该地区周围的左下角,(-125, 27)将夏威夷放在旁边,大约在(-112, 27)。
编辑3:
我的代码:
import geopandas as gpd
import matplotlib.pyplot as plt
# import the United States shape file
df = gpd.read_file('Desktop/cb_2018_us_state_500k/cb_2018_us_state_500k.shp')
# exclude the values that we would not like to display
exclude = df[~df['STUSPS'].isin(['PR', 'AS', 'VI', 'MP', 'GU','AK'])]
# create a plot figure
fig, ax = plt.subplots(1, figsize=(20, 10))
exclude.plot(column="NAME", ax=ax)
_ = ax.set_xlim([-130, -64])
_ = ax.set_ylim([22, 53])
Run Code Online (Sandbox Code Playgroud)
我现在拥有的示例图:
任何见解或资源、解释或示例的链接将不胜感激。
注意:从技术上讲,我可以通过简单地使用已在该位置包含阿拉斯加和夏威夷的形状文件(例如内政部提供的形状文件)来避免这种情况;但是,如果我想说添加关岛或波多黎各,这将不起作用。
期望的结果:
编辑4:我想要做的事情与这个问题类似,但是是在Python而不是R中。
图片来源:墨菲
您可以简单地使用 实现最终目标ax.inset_axes(),然后在插图上指定不同的经度/纬度范围。
Here\xe2\x80\x99s 是一个简单的方法:
\n# import the United States shape file\ndf = gpd.read_file(\'cb_2018_us_state_500k/cb_2018_us_state_500k.shp\')\n\n# set state code as index, exclude states that we will never display\ndf = df.set_index(\'STUSPS\').drop(index=[\'PR\', \'VI\', \'MP\', \'GU\', \'AS\'])\n\n# create an axis with 2 insets \xe2\x88\x92 this defines the inset sizes\nfig, continental_ax = plt.subplots(figsize=(20, 10))\nalaska_ax = continental_ax.inset_axes([.08, .01, .20, .28])\nhawaii_ax = continental_ax.inset_axes([.28, .01, .15, .19])\n\n# Set bounds to fit desired areas in each plot\ncontinental_ax.set_xlim(-130, -64)\ncontinental_ax.set_ylim(22, 53)\n\nalaska_ax.set_ylim(51, 72)\nalaska_ax.set_xlim(-180, -127)\n\nhawaii_ax.set_ylim(18.8, 22.5)\nhawaii_ax.set_xlim(-160, -154.6)\n\n# Plot the data per area - requires passing the same choropleth parameters to each call\n# because different data is used in each call, so automatically setting bounds won\xe2\x80\x99t work\nvmin, vmax = df[\'ALAND\'].agg([\'min\', \'max\'])\ndf.drop(index=[\'HI\', \'AK\']).plot(column="ALAND", ax=continental_ax, vmin=vmin, vmax=vmax)\ndf.loc[[\'AK\']].plot(column="ALAND", ax=alaska_ax, vmin=vmin, vmax=vmax)\ndf.loc[[\'HI\']].plot(column="ALAND", ax=hawaii_ax, vmin=vmin, vmax=vmax)\n\n# remove ticks\nfor ax in [continental_ax, alaska_ax, hawaii_ax]:\n ax.set_yticks([])\n ax.set_xticks([])\nRun Code Online (Sandbox Code Playgroud)\n这里\xe2\x80\x99是结果,正如你所看到的,颜色与每个州\xe2\x80\x99的土地质量成正比:
\n\n| 归档时间: |
|
| 查看次数: |
1033 次 |
| 最近记录: |