# get all upper bounds
upper_bounds = mapclassify.Quantiles(gdf.random_col, k=5).bins
# insert minimal value in front to get all bounds
bounds = np.insert(upper_bounds, 0, gdf.random_col.min())
# format the numerical legend here
intervals = [
f'{bounds[i]:.0f}-{bounds[i+1]:.0f}' for i in range(len(bounds)-1)
]
# get all the legend labels
legend_labels = ax.get_legend().get_texts()
# replace the legend labels
for interval, legend_label in zip(intervals, legend_labels):
legend_label.set_text(interval)
2条答案
按热度按时间rekjcdws1#
由于我最近遇到了同样的问题,并且在Stack Overflow或其他网站上似乎没有现成的解决方案,我想我会发布我采取的方法,以防它有用。
首先,使用
geopandas
世界Map绘制一个基本图:我使用的方法依赖于
matplotlib.legend.Legend
对象的get_texts()
方法,然后迭代leg.get_texts()
中的项,将文本元素拆分为上下边界,然后创建一个应用了格式的新字符串,并使用set_text()
方法进行设置。这是一个非常“试错”的方法,所以如果有更好的方法,我不会感到惊讶。尽管如此,也许这会有所帮助。
vsikbqxv2#
方法一
根据geopandas的更新日志,从**版本0开始,您可以在
legend_kwds
中pass afmt
。8.0(2020年6月24日)**设置图例标签的格式。例如,如果你不想使用小数点,你可以设置fmt='{:.0f}'
,就像用f字符串格式化数字一样。以下是分位数贴图的示例:这为我们提供:
方法二
事实上,GeoPandas使用PySal的mapclassify来计算和生成Map图例。对于上面的分位数Map(k=5),我们可以通过
mapclassify
中的.Quantiles()
得到分类。函数返回一个
mapclassify.classifiers.Quantiles
对象:该对象有一个属性
bins
,它返回一个numpy数组,其中包含所有类的上限。因此,我们可以使用这个函数来获得类的所有边界,因为较低类中的上限等于较高类中的下限。唯一缺少的是最低类中的下限,它等于您试图在DataFrame中分类的列的最小值。下面是一个将所有数字舍入为整数的示例:
我们最终会得到:
正如您所看到的,由于我们在较低的级别上执行操作,因此我们能够自定义图例标签的外观,例如删除那些括号,但在中间使用
-
。方法三
除了GeoPandas的
.plot()
方法之外,您还可以考虑geoplot提供的.choropleth()
函数,在该函数中,您可以轻松使用不同类型的scheme和数量的类,同时传递legend_labels
参数来修改图例标签。比如说也就是说