在Geopandas中更改颜色条

4

问题

在绘制GeoDataFrame时,如何访问创建的colorbar实例?在这个例子中,我绘制了法国入侵俄罗斯期间的军队移动和规模,规模小于10000的军队以红色表示。我如何让colorbar显示红色代表小于10000?

MCVE:

import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
from shapely.geometry import Point, LineString
import geopandas as gpd

# ingest troop movement data
PATH = ("https://vincentarelbundock.github.io/Rdatasets/csv/HistData/"
        "Minard.troops.csv")
troops = pd.read_csv(PATH)
troops['geometry'] = troops.apply(lambda row: Point(row.long, row.lat), axis=1)
troops = gpd.GeoDataFrame(troops)

# get army group paths
grouped = troops.groupby('group')
groups = [[LineString(group[['long', 'lat']].values), name]
          for name, group in grouped]
groups = pd.DataFrame(groups, columns=['geometry', 'army group'])
groups = gpd.GeoDataFrame(groups)
groups.plot(color=['red', 'green', 'blue'], lw=0.5)

# plot troop sizes
cmap = mpl.cm.get_cmap('cool')
cmap.set_under('red')
troops.plot(column='survivors', ax=plt.gca(),
            cmap=cmap, vmin=10000, legend=True, markersize=50)

输出:

enter image description here

在这里,最后一行中的legend=True添加了图例。

尝试解决方案

我知道如果我自己制作着色条,只需传递参数extend='min'即可在颜色条底部添加红色三角形。

我也知道可以通过(如this answer中建议的)获取着色条轴:

cax = plt.gcf().axes[1]

但我不知道这如何帮助我编辑色条。我甚至无法使用 cax.set_label('troop size') 添加标签。(即使 cax.get_label() 返回 'troop size',我也看不到那个标签出现在任何地方)。
这些轴似乎由两个多边形组成:
In[315]: cax.artists
Out[315]: 
[<matplotlib.patches.Polygon at 0x1e0e73c8>,
 <matplotlib.patches.Polygon at 0x190c8f28>]

我不知道该怎么做。即使我能找到实际的colorbar实例,也不知道如何扩展它,因为Colorbar类的文档没有提及任何相关内容。 替代方案
  1. 是否有办法通过GeoDataFrame.plot函数传递extend关键字参数?
  2. 我是否可以通过保存绘图时的颜色条实例或在图中找到它来访问颜色条实例?
  3. 我该如何直接使用Matplotlib构建颜色条?如何避免更改参数后它与图形偏离?

抱歉,这不是你问题的答案,至少不是直接的答案。对于我的大多数图形绘制,我使用pygal非常成功。http://pygal.org/en/stable/documentation/types/line.html - sehafoc
附注:对于标签,您需要使用“ylabel”而不是“label”:“cax.set_ylabel('troop size')”(或者对于上面的情况:“set_title”) - joris
1个回答

4

有一个与构建colorbar相关的问题和PR: https://github.com/geopandas/geopandas/issues/697。但是目前最好的解决办法可能是自己创建colorbar:

创建具有legend=False的相同图:

cmap = mpl.cm.get_cmap('cool')
cmap.set_under('red')
ax = troops.plot(column='survivors', cmap=cmap, vmin=10000, legend=False, markersize=50)

现在,我们已经创建了一个散点图的点集合,作为ax.collections的第一个元素,因此我们可以指示matplotlib基于这个映射创建一个颜色条(现在我们可以传递其他关键字):
scatter = ax.collections[0]
plt.colorbar(scatter, ax=ax, extend='min')

这给了我:

在此输入图片描述


谢谢!这是我发布的完整代码(包括军团路径)中的ax.collections[1]。最安全的通用解决方案可能是在绘图命令之后立即编写scatter = ax.collections[-1] - Joooeey
啊,确实,如果有多个图表,你需要小心选择正确的! - joris

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