簡體   English   中英

Python Geopandas:多圖的單個圖例

[英]Python Geopandas: Single Legend for multiple plots

如何將單個圖例用於多個 geopandas 圖?

現在我有一個這樣的圖:

2005 年、2009 年和 2013 年德國人口密度

這篇文章解釋了如何將每個 plot 的圖例值設置為相同。 不過,我希望所有情節都有一個傳奇。 最佳情況下,應該可以為我想要 plot 的不同 df 提供多個圖例。 例如,您在圖片中看到的線條也有描述。

這是我當前的代碼:

years = [2005, 2009, 2013]
    # initialize figure 
    fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(10, 10), dpi=300, constrained_layout=True)
    for i, year in enumerate(years):
        # subset lines
        lines_plot = lines[lines['year'] == year]
        # subset controls plot
        controls_plot = controls[controls['year'] == year]
        # draw subfig
        controls_plot.plot(column='pop_dens', ax=ax[i], legend=True, legend_kwds={'orientation': "horizontal"})
        lines_plot.plot(ax=ax[i], color='red', lw=2, zorder=2)

關於您的第一個問題“如何將單個圖例用於多個 geopandas 地塊?” 您可以確保您的繪圖都使用相同的 colors(使用 .plot() 函數的 vmin 和 vmax 參數),然后在圖中添加一個顏色條,如下所示。 對於紅線,您可以添加另一個圖例(從技術上講,第一件事是彩條而不是圖例)。

import geopandas as gpd
from matplotlib import pyplot as plt
import matplotlib.cm as cm
import matplotlib.colors as mcolors
from matplotlib.lines import Line2D

world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))

f, ax = plt.subplots(nrows=1, ncols=3, figsize=(9, 4))

# define min and max values and colormap for the plots
value_min = 0
value_max = 1e7
cmap = 'viridis'

world.plot(ax=ax[0], column='pop_est', vmin=value_min, vmax=value_max, cmap=cmap)
world.plot(ax=ax[1], column='pop_est', vmin=value_min, vmax=value_max, cmap=cmap)
world.plot(ax=ax[2], column='pop_est', vmin=value_min, vmax=value_max, cmap=cmap)

# define a mappable based on which the colorbar will be drawn
mappable = cm.ScalarMappable(
    norm=mcolors.Normalize(value_min, value_max),
    cmap=cmap
)

# define position and extent of colorbar
cb_ax = f.add_axes([0.1, 0.1, 0.8, 0.05])

# draw colorbar
cbar = f.colorbar(mappable, cax=cb_ax, orientation='horizontal')

# add handles for the legend
custom_lines = [
    Line2D([0], [0], color='r'),
    Line2D([0], [0], color='b'),
]

# define labels for the legend
custom_labels = ['red line', 'blue line']

# plot legend, loc defines the location
plt.legend(
    handles=custom_lines,
    labels=custom_labels,
    loc=(.4, 1.5),
    title='2nd legend',
    ncol=2
)
plt.tight_layout()
plt.show()

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM