Jupyter/Geopandas 情节顺序打破了 figsize
Jupyter/Geopandas plot order breaks figsize
我有一个笔记本 (github link),我在其中使用 geopandas 绘制带有不同国家/地区颜色的地图。根据绘图的顺序,有时它不符合我指定的 figsize() 。我在 Ubuntu 20.04 和 Firefox 中的本地 jupyter 运行 以及 Chromium 中的 Binder 和 Colab 运行 中重复看到这种行为。
有人可以帮助我了解发生了什么吗?这是一个错误还是我控制 geopandas/matplotlib 错误?
import matplotlib.pyplot as plt
import geopandas as gpd
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
sixc = world[ world['continent'] != 'Antarctica' ]
asia = world[ world['continent'] == 'Asia' ]
noam = world[ world['continent'] == 'North America']
swed = world[ world['iso_a3'] == 'SWE' ]
# This works, makes a 2x1 landscapey aspect
axes = sixc.plot(figsize=(8,4), color='lightgrey')
asia.plot(ax=axes, color='green')
noam.plot(ax=axes, color='purple')
# Plotting swed at the end breaks figsize, makes it squareish
axes = sixc.plot(figsize=(8,4), color='lightgrey')
asia.plot(ax=axes, color='green')
noam.plot(ax=axes, color='purple')
swed.plot(ax=axes, color='yellow')
# Plotting swed in the middle makes it ok again
axes = sixc.plot(figsize=(8,4), color='lightgrey')
asia.plot(ax=axes, color='green')
swed.plot(ax=axes, color='yellow')
noam.plot(ax=axes, color='purple')
(另外,对于我的一些(但不是全部!)学生来说,那个破碎的情节也没有浅灰色背景国家。这可能是 result/side-effect 导致方面问题的原因吗?)
关于 matplotlib
中宽高比的工作原理,这篇文章很棒 ;然而,尽管这些概念很有用,但 GeoSeries.plot
是建立在 matplotlib 之上的,因此就解决问题的代码而言,答案可能无济于事。
最简单的做法是将 aspect='equal'
作为 default is 'auto'
for "aspect" in link).
传递给每个 GeoSeries.plot
至于你的其他问题,我无法重现,我会让那些同学升级到最新版本或者换一个IDE。这在 Jupyter Notebook 中对我有用。
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
sixc = world[ world['continent'] != 'Antarctica' ]
asia = world[ world['continent'] == 'Asia' ]
noam = world[ world['continent'] == 'North America']
swed = world[ world['iso_a3'] == 'SWE' ]
# This works, makes a 2x1 landscapey aspect
axes = sixc.plot(figsize=(8,4), color='lightgrey', aspect='equal')
asia.plot(ax=axes, color='green', aspect='equal')
noam.plot(ax=axes, color='purple', aspect='equal')
# Plotting swed at the end breaks figsize, makes it squareish
axes = sixc.plot(figsize=(8,4), color='lightgrey', aspect='equal')
asia.plot(ax=axes, color='green', aspect='equal')
noam.plot(ax=axes, color='purple', aspect='equal')
swed.plot(ax=axes, color='yellow', aspect='equal')
# Plotting swed in the middle makes it ok again
axes = sixc.plot(figsize=(8,4), color='lightgrey', aspect='equal')
asia.plot(ax=axes, color='green', aspect='equal')
swed.plot(ax=axes, color='yellow', aspect='equal')
noam.plot(ax=axes, color='purple', aspect='equal')
此外,作为旁注,数据集与 99
作为 ISO
代码存在一些不规则性。我相信它会在更新中得到修复(参见 https://github.com/geopandas/geopandas/issues/1041)....您可以使用以下代码手动修复它们:
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
world.loc[world['name'] == 'France', 'iso_a3'] = 'FRA'
world.loc[world['name'] == 'Norway', 'iso_a3'] = 'NOR'
world.loc[world['name'] == 'Somaliland', 'iso_a3'] = 'SOM'
world.loc[world['name'] == 'Kosovo', 'iso_a3'] = 'RKS'
在您使用的 geopandas
v 0.8.1 中,您使用的绘图命令的 default
纵横比为 auto
。因此,您获得的输出图将具有不可预测的纵横比值。尝试
print(axes.get_aspect())
每个地块。在以前版本的 geopandas 中,将得到 equal
作为输出,并且绘图是正确的。但在您的情况下,您将获得不代表等方面的值。
为了简单地解决您的问题,您可以添加这行代码:
axes.set_aspect('equal')
在最后一个情节陈述之后。
我有一个笔记本 (github link),我在其中使用 geopandas 绘制带有不同国家/地区颜色的地图。根据绘图的顺序,有时它不符合我指定的 figsize() 。我在 Ubuntu 20.04 和 Firefox 中的本地 jupyter 运行 以及 Chromium 中的 Binder 和 Colab 运行 中重复看到这种行为。
有人可以帮助我了解发生了什么吗?这是一个错误还是我控制 geopandas/matplotlib 错误?
import matplotlib.pyplot as plt
import geopandas as gpd
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
sixc = world[ world['continent'] != 'Antarctica' ]
asia = world[ world['continent'] == 'Asia' ]
noam = world[ world['continent'] == 'North America']
swed = world[ world['iso_a3'] == 'SWE' ]
# This works, makes a 2x1 landscapey aspect
axes = sixc.plot(figsize=(8,4), color='lightgrey')
asia.plot(ax=axes, color='green')
noam.plot(ax=axes, color='purple')
# Plotting swed at the end breaks figsize, makes it squareish
axes = sixc.plot(figsize=(8,4), color='lightgrey')
asia.plot(ax=axes, color='green')
noam.plot(ax=axes, color='purple')
swed.plot(ax=axes, color='yellow')
# Plotting swed in the middle makes it ok again
axes = sixc.plot(figsize=(8,4), color='lightgrey')
asia.plot(ax=axes, color='green')
swed.plot(ax=axes, color='yellow')
noam.plot(ax=axes, color='purple')
(另外,对于我的一些(但不是全部!)学生来说,那个破碎的情节也没有浅灰色背景国家。这可能是 result/side-effect 导致方面问题的原因吗?)
关于 matplotlib
中宽高比的工作原理,这篇文章很棒 GeoSeries.plot
是建立在 matplotlib 之上的,因此就解决问题的代码而言,答案可能无济于事。
最简单的做法是将 aspect='equal'
作为 default is 'auto'
for "aspect" in link).
GeoSeries.plot
至于你的其他问题,我无法重现,我会让那些同学升级到最新版本或者换一个IDE。这在 Jupyter Notebook 中对我有用。
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
sixc = world[ world['continent'] != 'Antarctica' ]
asia = world[ world['continent'] == 'Asia' ]
noam = world[ world['continent'] == 'North America']
swed = world[ world['iso_a3'] == 'SWE' ]
# This works, makes a 2x1 landscapey aspect
axes = sixc.plot(figsize=(8,4), color='lightgrey', aspect='equal')
asia.plot(ax=axes, color='green', aspect='equal')
noam.plot(ax=axes, color='purple', aspect='equal')
# Plotting swed at the end breaks figsize, makes it squareish
axes = sixc.plot(figsize=(8,4), color='lightgrey', aspect='equal')
asia.plot(ax=axes, color='green', aspect='equal')
noam.plot(ax=axes, color='purple', aspect='equal')
swed.plot(ax=axes, color='yellow', aspect='equal')
# Plotting swed in the middle makes it ok again
axes = sixc.plot(figsize=(8,4), color='lightgrey', aspect='equal')
asia.plot(ax=axes, color='green', aspect='equal')
swed.plot(ax=axes, color='yellow', aspect='equal')
noam.plot(ax=axes, color='purple', aspect='equal')
此外,作为旁注,数据集与 99
作为 ISO
代码存在一些不规则性。我相信它会在更新中得到修复(参见 https://github.com/geopandas/geopandas/issues/1041)....您可以使用以下代码手动修复它们:
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
world.loc[world['name'] == 'France', 'iso_a3'] = 'FRA'
world.loc[world['name'] == 'Norway', 'iso_a3'] = 'NOR'
world.loc[world['name'] == 'Somaliland', 'iso_a3'] = 'SOM'
world.loc[world['name'] == 'Kosovo', 'iso_a3'] = 'RKS'
在您使用的 geopandas
v 0.8.1 中,您使用的绘图命令的 default
纵横比为 auto
。因此,您获得的输出图将具有不可预测的纵横比值。尝试
print(axes.get_aspect())
每个地块。在以前版本的 geopandas 中,将得到 equal
作为输出,并且绘图是正确的。但在您的情况下,您将获得不代表等方面的值。
为了简单地解决您的问题,您可以添加这行代码:
axes.set_aspect('equal')
在最后一个情节陈述之后。