问题
如何访问绘制 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)
输出:
在这里,最后一行中的
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 没有提到任何类似的东西。替代品
extend
函数传递 GeoDataFrame.plot
关键字? 最佳答案
有一个问题(和 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')
这给了我
关于python - 更改 Geopandas 中的颜色条,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51885589/