映射和绘图工具#

GeoPandas 提供了一个高层接口,用于 matplotlib 库以制作地图。绘制形状就像在 GeoSeriesGeoDataFrame 上使用 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();
../../_images/chicago_singlecolor.png

请注意,一般来说,任何可以传递给 pyplotmatplotlib 中的选项(或 适用于线的样式选项)都可以传递给 plot() 方法。

分级地图#

GeoPandas 使创建分级色图变得简单(分级色图是指每个形状的颜色基于其关联变量的值的地图)。只需使用 plot 命令,column 参数设置为您希望用来分配颜色的值所在的列。

 # Plot by population
In [6]: chicago.plot(column="POP2010");
../../_images/chicago_population.png

创建图例#

在绘制地图时,可以使用 legend 参数启用图例:

# Plot population estimates with an accurate legend
In [7]: chicago.plot(column='POP2010', legend=True);
../../_images/chicago_choro.png

下面的示例在地图下方绘制色条,并使用 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"},
   ...: );
   ...: 
../../_images/chicago_horizontal.png

然而,图例和绘图轴的默认外观可能并不令人满意。可以定义绘图轴(使用 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"},
   ....: );
   ....: 
../../_images/chicago_cax.png

选择颜色#

您还可以通过 plot() 使用 cmap 选项修改颜色。有关 colormaps 的完整列表,请参见 在 Matplotlib 中选择 Colormaps

In [15]: chicago.plot(column='POP2010', cmap='OrRd');
../../_images/chicago_red.png

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

In [16]: chicago.boundary.plot();
../../_images/chicago_transparent.png

颜色映射的缩放方式也可以通过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');
../../_images/chicago_quantiles.png

缺失数据#

在某些情况下,人们可能希望绘制包含缺失值的数据 - 对于某些特征,根本不知道其值。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');
../../_images/missing_vals.png

然而,通过传递 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",
   ....:     },
   ....: );
   ....: 
../../_images/missing_vals_grey.png ../../_images/missing_vals_hatch.png

其他地图自定义#

地图通常不需要有坐标轴标签。您可以使用 set_axis_off()axis("off") 坐标轴方法将其关闭。

In [23]: ax = chicago.plot()

In [24]: ax.set_axis_off();
../../_images/set_axis_off.png

带有图层的地图#

制作具有多个图层的地图有两种策略 - 一种更简洁,另一种稍微灵活一些。

在合并地图之前,请记得始终确保它们共享一个共同的坐标参考系统(这样它们才能对齐)。

# 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
../../_images/capitals.png

方法 1

In [27]: base = chicago.plot(color='white', edgecolor='black')

In [28]: groceries.plot(ax=base, marker='o', color='red', markersize=5);
../../_images/groceries_over_chicago_1.png

方法 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();
../../_images/groceries_over_chicago_2.png

控制图中多个图层的顺序#

在绘制多个图层时,使用 zorder 来控制绘制图层的顺序。
zorder 的值越小,图层在地图上的位置就越低,反之亦然。

如果没有指定 zorder,城市(点)会被绘制在世界(多边形)下面,按照基于几何类型的默认顺序排列。

In [33]: ax = groceries.plot(color='k')

In [34]: chicago.plot(ax=ax);
../../_images/zorder_default.png

您可以为城市设置比世界更高的 zorder 以将其移动到顶部。

In [35]: ax = groceries.plot(color='k', zorder=2)

In [36]: chicago.plot(ax=ax, zorder=1);
../../_images/zorder_set.png

Pandas 绘图#

绘图方法还允许使用不同的绘图样式来自pandas,以及默认的 geo 绘图。这些方法可以通过在 plot() 中使用 kind 关键字参数来访问,并包括:

  • geo 用于制图

  • line 用于线型图

  • barbarh 用于条形图

  • hist 用于直方图

  • box 用于箱形图

  • kdedensity 用于密度图

  • area 用于面积图

  • scatter 用于散点图

  • hexbin 用于六边形散点图

  • pie 用于饼图

In [37]: chicago.plot(kind="scatter", x="POP2010", y="POP2000")
Out[37]: <Axes: xlabel='POP2010', ylabel='POP2000'>
../../_images/pandas_line_plot.png

您还可以使用 GeoDataFrame.plot. 访问器方法创建其他这些图表,而不是提供 kind 关键字参数。 例如, hist 可以用来绘制来自芝加哥数据集的两年的人口直方图。

In [38]: chicago[["POP2000", "POP2010", "geometry"]].plot.hist(alpha=.4)
Out[38]: <Axes: ylabel='Frequency'>
../../_images/pandas_hist_plot.png

有关更多信息,请参见图表可视化在pandas文档中。

其他资源#

不同绘图任务的Jupyter Notebooks链接:

制作热图