Как создать легенду с прокси-художником для контурного сюжета в Matplotlib
Я пытаюсь создать графику, где я накладываю несколько контурных графиков на одно изображение. Поэтому я хочу иметь цветные полосы для каждого из графиков, а также легенду, указывающую, что представляет каждый контур. Однако Matplotlib не позволит мне создать отдельную легенду для моих контурных сюжетов. Простой пример:
import matplotlib as mpl
import matplotlib.pyplot as plt
import cartopy
import cartopy.crs as ccrs
import numpy as np
def create_contour(i,j):
colors = ["red","green","blue"]
hatches = ['-','+','x','//','*']
fig = plt.figure()
ax = plt.axes(projection=ccrs.PlateCarree())
ax.set_extent((-15.0,15.0,-15.0,15.0))
delta = 0.25
x = np.arange(-3.0,3.0,delta)
y = np.arange(-2.0,2.0,delta)
X, Y = np.meshgrid(x, y)
data = np.full(np.shape(X), 1.0)
plot = ax.contourf(X,Y,data, levels = [float(i),float(i+1)], hatch=[hatches[j]], colors = colors[i], label="label")
plt.legend(handles=[plot], labels=["label"])
plt.savefig("figure_"+str(i)+".png")
create_contour(1,3)
Когда я запускаю это, я получаю следующее сообщение:
UserWarning: Legend не поддерживает экземпляры (объект matplotlib.contour.QuadContourSet в 0x7fa69df7cac8) экземпляры. Вместо этого можно использовать прокси-исполнителя. Смотрите: http://matplotlib.org/users/legend_guide.html#creating-artists-specifically-for-adding-to-the-legend-aka-proxy-artists "aka-proxy-artist".format(orig_handle)
Но, насколько я могу судить, я следую этим указаниям как можно точнее, с той лишь разницей, что они не используют контур в этом примере.
Любая помощь будет принята с благодарностью.
1 ответ
Комментарии к вашему вопросу выглядят так, как будто они решили проблему (путем создания пользовательских исправлений и передачи их в легенду). Есть также пример, который я добавил много лет назад в документацию matplotlib, чтобы сделать что-то подобное (примерно в то же время я добавил штриховку контура в matplotlib): https://matplotlib.org/examples/pylab_examples/contourf_hatching.html
Это настолько разумный запрос, что в наборе контуров даже есть метод, позволяющий получить прокси легенды из коробки: ContourSet.legend_elements.
Так что ваш пример может выглядеть примерно так:
%matplotlib inline
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import numpy as np
fig = plt.figure(figsize=(10, 10))
ax = plt.axes(projection=ccrs.PlateCarree())
ax.coastlines('10m')
y = np.linspace(40.0, 60.0, 30)
x = np.linspace(-10.0, 10.0, 40)
X, Y = np.meshgrid(x, y)
data = 2*np.cos(2*X**2/Y) - np.sin(Y**X)
cs = ax.contourf(X, Y, data, 3,
hatches=['//','+','x','o'],
alpha=0.5)
artists, labels = cs.legend_elements()
plt.legend(handles=artists, labels=labels)
plt.show()