在Geopandas中编辑颜色条(图例)?

4

在我创建的 Geopandas 世界 Choropleth 中,我希望可以编辑颜色条的多个属性,包括大小(大约与地图本身匹配)、文本大小(当前显示得太小)以及添加标签。从一些阅读中得知,在 Geopandas 中没有简单的方法来明确地解决这个问题,所以我想知道是否有人能提供任何解决方案?非常感谢您的帮助。

以下是我目前正在使用的代码(为了一些背景信息,中间部分仅是将按国家汇总的列表与数字合并,作为着色的基础,并将其与框架合并)

fig, ax = plt.subplots(figsize=(40,29.171))
world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))

world=pd.DataFrame(world)
world['LEADS']=0.1
world = world.set_index('name')
world['name']=world.index
for x, y in zip(Countries, country_counts):
    world.loc[x, 'LEADS'] = y
world=geopandas.GeoDataFrame(world)

world = world[(world.index != "Antarctica")]
ax.set_axis_off()
#ax.legend(title="Leads")
world.plot(ax=ax, column='LEADS', cmap='Oranges', legend=True,linewidth = 1.5)
plt.tight_layout()

plt.savefig('plot_image.png', bbox_inches='tight', transparent=True)

在这里,一个理想的解决方案将保持图例选项具有的颜色,指定大小和文本大小,并在条形图顶部启用标签。不幸的是,我自己也很难弄清楚这些内容是如何完成的。

3个回答

7

我在这里找到的答案(链接) 帮助我找到了一个解决方法。

import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize = (30,25))
vmin = data.column.min()
vmax = data.column.max()
data.plot(ax=ax,column = column,edgecolor='black',cmap = 'YlOrRd',legend = False)
plt.xlim([6,19])
plt.ylim([36,47.7])
plt.xticks([], [])
plt.yticks([], [])

cax = fig.add_axes([1, 0.1, 0.03, 0.8])
sm = plt.cm.ScalarMappable(cmap='YlOrRd', norm=plt.Normalize(vmin=vmin, vmax=vmax))
sm._A = []
cbr = fig.colorbar(sm, cax=cax,)
cbr.ax.tick_params(labelsize=200) 
plt.tight_layout()
plt.savefig(os.path.join('out','fig.png'),format = 'png',bbox_inches='tight')
plt.show()

一旦你拥有了你的Colorbar对象 my_cbar,你可以像在matplotlib中设置属性一样进行设置。这里我改变了标签的大小。记得如果需要保存图形,请使用 bbox_inches='tight' :否则colorbar将不会被保存。

我的输出结果类似于下面这个,在修改颜色条字体大小的基础上:

map with colorbar

"cbr.ax.tick_params(labelsize=200)" 对我不起作用,但是 "plt.tick_params(labelsize=200)" 可以。不过我不知道为什么。 - Michael H
确保在您的 data.plot() 中添加 vmin=vmin, vmax=vmax,否则它将使用您拥有的值的默认值。如果您没有零值,则结果将不正确。 - Drummermean

0
显然,当创建一个颜色条时,总是会创建一个新的轴(如这里所示)。
因此,为了适应刻度的大小和位置,直接调整它们到新创建的轴上。以下是一个最小工作示例:
import geopandas as gpd
import matplotlib.pyplot as plt
data = gpd.read_file(gpd.datasets.get_path("nybb"))
    
#only one plots
ax = data.plot("BoroCode", legend=True)
colorbar_ax = ax.get_figure().axes[-1] #to get the last axis of the figure, it's the colorbar axes
colorbar_ax.set_title("Borow Code", size=30)
colorbar_ax.tick_params(labelsize=20)
plt.show()

如果您已经有几个轴,您可以对它们进行排序,以获取仅颜色条轴。
#multiple subplots
fig, axs = plt.subplots(1,2)
data.plot("BoroCode", ax=axs[1], legend=True, legend_kwds={"label":"Borow Code"})
data.plot("Shape_Area", ax=axs[0],legend=True)
colorbar_axs = [ax for ax in fig.axes if ax not in axs] #to get only the colorbar axis
colorbar_axs[0].set_ylabel("Borow Code", size=30)
colorbar_axs[0].tick_params(labelsize=20)
colorbar_axs[1].set_title("Shape Area", size=15)
colorbar_axs[0].tick_params(labelsize=3)
plt.show()

请注意,颜色条轴似乎总是按照创建它们的顺序排列,而不是在绘制图形时的显然顺序。

0

在单独的图中创建一个色条怎么样?

使用在这里找到的第一个示例,您可以创建一个函数:

import matplotlib as mpl
import numpy as np
import matplotlib.pyplot as plt

def create_colourbar(cmap, vmin, vmax, label, save_path=None):
    ''' Creates colourbar in separate figure 
    :param cmap: Cmap string or object
    :param vmin: minimum value in data array
    :param vmax: maximum value in data array
    :param label: colourbar label
    :param save_path: Save path, optional
    '''

    fig, ax = plt.subplots(figsize=(5, 1))

    cb1 = mpl.colorbar.ColorbarBase(cmap=cmap,
                                    norm=Normalize(vmin=vmin,
                                                   vmax=vmax),
                                    orientation='horizontal', ax=ax)
    cb1.set_label(label, fontsize=6)
    plt.tight_layout()
    if save_path:
        plt.savefig(save_path3)
    plt.show()

其中:

vmax = np.nanmax(world['LEADS'].values)
vmin = np.nanmin(world['LEADS'].values)

cmap 是一种颜色映射的字符串或对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接