Python Matplotlib底图中的图例

Python Matplotlib底图中的图例,python,matplotlib,matplotlib-basemap,Python,Matplotlib,Matplotlib Basemap,我正在底图中绘制多个点,希望有一个图例来表示每种颜色所代表的类别。但是,由于我在每个类别中都有多个点,因此图例会提取这些点中的每个点,从而在图例中为我提供同一类别的多个条目。有没有办法只显示一个整体颜色类别列表 m = Basemap(llcrnrlon=30.,llcrnrlat=20.,urcrnrlon=-160.,urcrnrlat=63.,projection='lcc',resolution='c',lat_1=20.,lat_2=40.,lon_0=90.,lat_0=50.)

我正在底图中绘制多个点,希望有一个图例来表示每种颜色所代表的类别。但是,由于我在每个类别中都有多个点,因此图例会提取这些点中的每个点,从而在图例中为我提供同一类别的多个条目。有没有办法只显示一个整体颜色类别列表

m = Basemap(llcrnrlon=30.,llcrnrlat=20.,urcrnrlon=-160.,urcrnrlat=63.,projection='lcc',resolution='c',lat_1=20.,lat_2=40.,lon_0=90.,lat_0=50.)

X,Y = m(lon,lat)    
m.drawcountries()
m.drawmapboundary(fill_color='lightblue')
m.drawparallels(np.arange(0.,90.,5.),color='gray',dashes=[1,3],labels=[1,0,0,0])
m.drawmeridians(np.arange(0.,360.,15.),color='gray',dashes=[1,3],labels=[0,0,0,1])
m.fillcontinents(color='beige',lake_color='lightblue')
plt.title('MERRA-Observation Correlations')

for j in range(len(corr)):
    if j == 0 or j == 1 or j ==2:
        m.plot(X[j],Y[j],'o',color='orange',markersize=np.absolute(corr[j])*17.5,label='Prairie')
    if j == 3 or j ==4 or j == 5:
        m.plot(X[j],Y[j],'o',color='violet',markersize=np.absolute(corr[j])*17.5,label='Tundra')
    if j ==6 or j == 7 or j == 8:
        m.plot(X[j],Y[j],'o',color='purple',markersize=np.absolute(corr[j])*17.5,label='Taiga')
    plt.legend()
注意:我将plt.legend放置在循环内外,结果相同


您可以保留m.plot返回的对象的句柄,而不是传递图例kwarg。然后,您可以仅使用要保留的绘图手动创建图例


有一个很好的例子。

您可以保留m.plot返回的对象的句柄,而不是传递图例kwarg。然后,您可以仅使用要保留的绘图手动创建图例


有一个很好的例子。

您似乎在为每个数据点绘制一条全新的直线。散点图可能更合适:不要使用
j
循环,尝试:

scale = 17.5
m.scatter(X[:3], Y[:3], color='orange', s=abs(corr[:3])*scale, label='Prairie')
m.scatter(X[3:6], Y[3:6], color='violet', s=abs(corr[3:6])*scale, label='Tundra')
m.scatter(X[6:], Y[6:], color='purple', s=abs(corr[6:])*scale, label='Taiga')

(未测试:我没有您的数据)。

您似乎在为每个数据点绘制一条全新的线。散点图可能更合适:不要使用
j
循环,尝试:

scale = 17.5
m.scatter(X[:3], Y[:3], color='orange', s=abs(corr[:3])*scale, label='Prairie')
m.scatter(X[3:6], Y[3:6], color='violet', s=abs(corr[3:6])*scale, label='Tundra')
m.scatter(X[6:], Y[6:], color='purple', s=abs(corr[6:])*scale, label='Taiga')

(未测试:我没有您的数据)。

另一种方法:将对
plt.legend()
的调用替换为此,并在for循环之外执行此操作:

ax = plt.gca()
handles, labels = ax.get_legend_handles_labels()
legend = plt.legend([handles[0],handles[3],handles[6]], labels[0],labels[3],labels[6]])
这将分离通过
plot
scatter
等)调用设置的内容,以发送到
legend
,因此您可以看到如何以不同方式更改图例

xnx的散射解决方案看起来也不错


p、 这与basemap无关,它是matplotlib绘图的通用工具

另一种方法:用以下方法替换对
plt.legend()
的调用,并在for循环之外执行:

ax = plt.gca()
handles, labels = ax.get_legend_handles_labels()
legend = plt.legend([handles[0],handles[3],handles[6]], labels[0],labels[3],labels[6]])
这将分离通过
plot
scatter
等)调用设置的内容,以发送到
legend
,因此您可以看到如何以不同方式更改图例

xnx的散射解决方案看起来也不错

p、 这与basemap无关,它是matplotlib绘图的通用工具