代码之家  ›  专栏  ›  技术社区  ›  Joooeey

更改Geopandas中的颜色栏

  •  2
  • Joooeey  · 技术社区  · 6 年前

    问题

    如何访问绘制GeoDataFrame时创建的colorbar实例?在这个例子中,我用红色标出了法国入侵俄罗斯期间军队的行动和规模,军队规模小于10000人。我怎样才能让颜色条显示红色意味着低于10000?

    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>]
    

    不知道该怎么办。即使我能找到实际的colorbar实例,我也不知道如何将它扩展为 docs for the Colorbar class 别提那样的事。

    选择

    1. extend 关键字通过 GeoDataFrame.plot 功能?

    2. 我可以在绘图时保存colorbar实例,或者在图中找到它,以某种方式访问它吗?

    3. 如何使用Matplotlib直接构建colorbar?如果我改变参数,如何避免它偏离曲线图呢?

    1 回复  |  直到 6 年前
        1
  •  3
  •   joris    6 年前

    有一个问题(和PR)是关于如何将关键字传递给colorbar结构的: 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