更改Geopandas中的颜色栏

时间:2018-08-16 21:29:44

标签: python matplotlib geopandas

问题

在绘制GeoDataFrame时如何访问创建的颜色栏实例?在此示例中,我绘制了法国入侵俄罗斯期间的部队移动和规模,用红色绘制的部队规模小于10000。如何使颜色条显示红色表示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()确实返回了“部队人数”,但我在任何地方都看不到该标签)

这些轴似乎由两个多边形组成:

In[315]: cax.artists
Out[315]: 
[<matplotlib.patches.Polygon at 0x1e0e73c8>,
 <matplotlib.patches.Polygon at 0x190c8f28>]

不知道该怎么做。而且即使我能找到实际的颜色条实例,我也不知道如何扩展它,因为docs for the Colorbar class并没有提到类似的东西。

替代

  1. 是否可以通过extend函数传递GeoDataFrame.plot关键字?

  2. 我可以通过绘制或在图中找到它来通过某种方式访问​​颜色条实例吗?

  3. 我将如何直接使用Matplotlib构建颜色栏?以及如果我更改参数,如何避免它偏离绘图?

1 个答案:

答案 0 :(得分:2)

有一个问题(和PR),使得可以将关键字传递到颜色栏构造:https://github.com/geopandas/geopandas/issues/697
但是现在,最好的解决方法是我认为自己创建颜色条:

使用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')

这给了我

enter image description here