映射和绘图工具#
GeoPandas 提供了一个高层接口,用于 matplotlib 库以制作地图。绘制形状就像在 GeoSeries
或 GeoDataFrame
上使用 plot()
方法一样简单。
加载一些示例数据:
In [1]: import geodatasets
In [2]: chicago = geopandas.read_file(geodatasets.get_path("geoda.chicago_commpop"))
In [3]: groceries = geopandas.read_file(geodatasets.get_path("geoda.groceries"))
您现在可以绘制这些GeoDataFrames:
# Examine the chicago GeoDataFrame
In [4]: chicago.head()
Out[4]:
community ... geometry
0 DOUGLAS ... MULTIPOLYGON (((-87.609140876 41.844692503, -8...
1 OAKLAND ... MULTIPOLYGON (((-87.592152839 41.816929346, -8...
2 FULLER PARK ... MULTIPOLYGON (((-87.628798237 41.801893034, -8...
3 GRAND BOULEVARD ... MULTIPOLYGON (((-87.606708126 41.816813771, -8...
4 KENWOOD ... MULTIPOLYGON (((-87.592152839 41.816929346, -8...
[5 rows x 9 columns]
# Basic plot, single color
In [5]: chicago.plot();

请注意,一般来说,任何可以传递给 pyplot 在 matplotlib 中的选项(或 适用于线的样式选项)都可以传递给 plot()
方法。
分级地图#
GeoPandas 使创建分级色图变得简单(分级色图是指每个形状的颜色基于其关联变量的值的地图)。只需使用 plot 命令,column
参数设置为您希望用来分配颜色的值所在的列。
# Plot by population
In [6]: chicago.plot(column="POP2010");

创建图例#
在绘制地图时,可以使用 legend
参数启用图例:
# Plot population estimates with an accurate legend
In [7]: chicago.plot(column='POP2010', legend=True);

下面的示例在地图下方绘制色条,并使用 legend_kwds
添加其标签:
# Plot population estimates with an accurate legend
In [8]: chicago.plot(
...: column="POP2010",
...: legend=True,
...: legend_kwds={"label": "Population in 2010", "orientation": "horizontal"},
...: );
...:

然而,图例和绘图轴的默认外观可能并不令人满意。可以定义绘图轴(使用 ax
)和图例轴(使用 cax
),然后将它们传递给 plot()
调用。下面的示例使用 mpl_toolkits
来水平对齐绘图轴和图例轴,并更改宽度:
# Plot population estimates with an accurate legend
In [9]: import matplotlib.pyplot as plt
In [10]: from mpl_toolkits.axes_grid1 import make_axes_locatable
In [11]: fig, ax = plt.subplots(1, 1)
In [12]: divider = make_axes_locatable(ax)
In [13]: cax = divider.append_axes("bottom", size="5%", pad=0.1)
In [14]: chicago.plot(
....: column="POP2010",
....: ax=ax,
....: legend=True,
....: cax=cax,
....: legend_kwds={"label": "Population in 2010", "orientation": "horizontal"},
....: );
....:

选择颜色#
您还可以通过 plot()
使用 cmap
选项修改颜色。有关 colormaps 的完整列表,请参见 在 Matplotlib 中选择 Colormaps。
In [15]: chicago.plot(column='POP2010', cmap='OrRd');

如果您只想显示边界并使颜色透明,您有两个选择。一个选择是使用 chicago.plot(facecolor="none", edgecolor="black")
。然而,这可能会导致很多混淆,因为 "none"
和 None
在使用 facecolor
的上下文中是不同的,并且它们的效果截然相反。 None
根据 matplotlib 会执行“默认行为”,如果您将其用于 facecolor
,它实际上会添加一种颜色。第二个选择是使用 chicago.boundary.plot()
。这个选择更加明确和清晰。:
In [16]: chicago.boundary.plot();

颜色映射的缩放方式也可以通过scheme
选项进行调整(如果您安装了mapclassify
,可以通过conda install -c conda-forge mapclassify
来完成)。scheme
选项可以设置为mapclassify提供的任何方案(例如:‘box_plot’,‘equal_interval’,‘fisher_jenks’,‘fisher_jenks_sampled’,‘headtail_breaks’,‘jenks_caspall’,‘jenks_caspall_forced’,‘jenks_caspall_sampled’,‘max_p_classifier’,‘maximum_breaks’,‘natural_breaks’,‘quantiles’,‘percentiles’,‘std_mean’或‘user_defined’)。参数可以通过classification_kwds字典传递。有关这些地图分类方案的更多详细信息,请参见mapclassify documentation。
In [17]: chicago.plot(column='POP2010', cmap='OrRd', scheme='quantiles');

缺失数据#
在某些情况下,人们可能希望绘制包含缺失值的数据 - 对于某些特征,根本不知道其值。Geopandas(从版本 0.7 开始)默认会忽略这样的特征。
In [18]: import numpy as np
In [19]: chicago.loc[np.random.choice(chicago.index, 30), 'POP2010'] = np.nan
In [20]: chicago.plot(column='POP2010');

然而,通过传递 missing_kwds
可以指定包含 None 或 NaN 的特征的样式和标签。
In [21]: chicago.plot(column='POP2010', missing_kwds={'color': 'lightgrey'});
In [22]: chicago.plot(
....: column="POP2010",
....: legend=True,
....: scheme="quantiles",
....: figsize=(15, 10),
....: missing_kwds={
....: "color": "lightgrey",
....: "edgecolor": "red",
....: "hatch": "///",
....: "label": "Missing values",
....: },
....: );
....:


其他地图自定义#
地图通常不需要有坐标轴标签。您可以使用 set_axis_off()
或 axis("off")
坐标轴方法将其关闭。
In [23]: ax = chicago.plot()
In [24]: ax.set_axis_off();

带有图层的地图#
制作具有多个图层的地图有两种策略 - 一种更简洁,另一种稍微灵活一些。
在合并地图之前,请记得始终确保它们共享一个共同的坐标参考系统(这样它们才能对齐)。
# Look at capitals
# Note use of standard `pyplot` line style options
In [25]: groceries.plot(marker='*', color='green', markersize=5);
# Check crs
In [26]: groceries = groceries.to_crs(chicago.crs)
# Now you can overlay over the outlines

方法 1
In [27]: base = chicago.plot(color='white', edgecolor='black')
In [28]: groceries.plot(ax=base, marker='o', color='red', markersize=5);

方法 2:使用 matplotlib 对象
In [29]: fig, ax = plt.subplots()
In [30]: chicago.plot(ax=ax, color='white', edgecolor='black')
Out[30]: <Axes: >
In [31]: groceries.plot(ax=ax, marker='o', color='red', markersize=5)
Out[31]: <Axes: >
In [32]: plt.show();

控制图中多个图层的顺序#
在绘制多个图层时,使用 zorder
来控制绘制图层的顺序。
zorder
的值越小,图层在地图上的位置就越低,反之亦然。
如果没有指定 zorder
,城市(点)会被绘制在世界(多边形)下面,按照基于几何类型的默认顺序排列。
In [33]: ax = groceries.plot(color='k')
In [34]: chicago.plot(ax=ax);

您可以为城市设置比世界更高的 zorder
以将其移动到顶部。
In [35]: ax = groceries.plot(color='k', zorder=2)
In [36]: chicago.plot(ax=ax, zorder=1);

Pandas 绘图#
绘图方法还允许使用不同的绘图样式来自pandas,以及默认的 geo
绘图。这些方法可以通过在 plot()
中使用 kind
关键字参数来访问,并包括:
geo
用于制图line
用于线型图bar
或barh
用于条形图hist
用于直方图box
用于箱形图kde
或density
用于密度图area
用于面积图scatter
用于散点图hexbin
用于六边形散点图pie
用于饼图
In [37]: chicago.plot(kind="scatter", x="POP2010", y="POP2000")
Out[37]: <Axes: xlabel='POP2010', ylabel='POP2000'>

您还可以使用 GeoDataFrame.plot.
访问器方法创建其他这些图表,而不是提供 kind
关键字参数。 例如, hist
可以用来绘制来自芝加哥数据集的两年的人口直方图。
In [38]: chicago[["POP2000", "POP2010", "geometry"]].plot.hist(alpha=.4)
Out[38]: <Axes: ylabel='Frequency'>

有关更多信息,请参见图表可视化在pandas文档中。
其他资源#
不同绘图任务的Jupyter Notebooks链接: