【发布时间】:2018-08-17 16:04:05
【问题描述】:
问题
如何访问在绘制 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 没有提到类似的东西。
替代品
有没有办法通过
GeoDataFrame.plot函数传递extend关键字?我能否通过在绘图时保存或在图中找到它来以某种方式访问颜色条实例?
如何直接使用 Matplotlib 构建颜色条?如果我更改参数,如何避免它偏离情节?
【问题讨论】:
-
对不起,这不是您问题的答案,无论如何也不是直接的。对于我的大部分图表,我在使用 pygal pygal.org/en/stable/documentation/types/line.html 方面取得了巨大成功
-
旁注:对于标签,您需要
ylabel而不是label:cax.set_ylabel('troop size')(或以上:set_title)
标签: python matplotlib geopandas