为什么在这个 cartopy 投影图中添加图例会显着增加执行时间以及如何解决这个问题?

问题描述

所以我编写了一个脚本来制作工作正常的数字(参见下面的模型示例)。但是当我在图中添加图例时,执行时间增加了很多。我真的不明白这里发生了什么,我天真地认为简单地添加一个图例并不是一件复杂的事情。

我怀疑这与 cartopy 投影有关,因为如果我不使用它,它就可以正常工作。

这里有什么问题,我该如何避免?

有问题的代码

import numpy as np
import xarray as xr
import matplotlib
import matplotlib.pyplot as plt
import cartopy.crs as ccrs

# Mockup dataset
num = 300
lat = np.linspace(-54,-59,num=num)
lon = np.linspace(-5,5,num=num)

data = np.outer(lat,lon)

ds = xr.DataArray(data=data,dims=["lat","lon"],coords=dict(lon=lon,lat=lat))


# Map projection
map_proj = ccrs.southPolarstereo()

ax = plt.axes(projection=map_proj)
ax.gridlines(draw_labels=True)
ax.set_extent([-3,4,-58,-54])

# Plot image
ds.plot(cmap="gray",add_colorbar=False,transform=ccrs.PlateCarree(),# data projection
        subplot_kws={'projection': map_proj}) # map projection

# Plot contours
cs = ds.plot.contour(transform=ccrs.PlateCarree())

# Make legend
proxy = [matplotlib.lines.Line2D([],[],c=pc.get_color()[0]) for pc in cs.collections]
labels = ["foo"] * len(cs.collections)
plt.legend(proxy,labels)

没有cartopy投影的代码

import numpy as np
import xarray as xr
import matplotlib
import matplotlib.pyplot as plt
import cartopy.crs as ccrs

# Mockup dataset
num = 300
lat = np.linspace(-54,lat=lat))

# Plot image
ds.plot(cmap="gray",add_colorbar=False) # map projection

# Plot contours
cs = ds.plot.contour()

# Make legend
proxy = [matplotlib.lines.Line2D([],c=pc.get_color()[0]) for pc in cs.collections]
plt.legend(proxy,labels)

解决方法

plt.legend(proxy,labels) 默认为 loc='best',它使用一种算法,如果您的轴中有大量数据,该算法可能会很慢,如果这些数据也有复杂的转换,则特别慢。而是手动执行 ax.legend(proxy,labels,loc='upper right')。见https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.legend.html

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...