如何使用Matplotlib动画将颜色条添加到Geopandas图

时间:2019-03-11 17:34:09

标签: python pandas matplotlib animation geopandas

我正在尝试在不使用FuncAnimation的情况下为地理熊猫情节制作动画。基本上eu_private_map是geopandas.geodataframe.GeoDataFrame以及其他字段,其中包含几列,连续10年中在不同的欧盟州具有参数x的值。每列都是一年中x的值。

from matplotlib.animation import FuncAnimation
from IPython.display import HTML
from mpl_toolkits.axes_grid1 import make_axes_locatable

fig = plt.figure() 
ax1 = fig.add_subplot(1,1,1)

def animate(year):
        ax1.clear()
        my_map = eu_private_map.plot(ax=ax1, column=year, vmin=0, vmax=30, legend=False)
        divider = make_axes_locatable(ax1)
        cax = divider.append_axes("right", size="5%", pad=0.05)
        plt.colorbar(my_map, cax=cax)

# the FuncAnimation function iterates through our animate function using the steps array
years = eu_private.columns.drop('country').tolist()
ani = FuncAnimation(fig, animate, years, interval=1000, blit=False)

HTML(ani.to_jshtml())

颜色栏让我很难受。一方面,如果我设置的图例= True,我不喜欢它的大小(见图)不一样,并且会产生怪异的效果(见图)的事实。我尝试了this,但遇到错误:AttributeError:'AxesSubplot'对象没有属性'autoscale_None'。但是,我无法在代码中发现麻烦,无法同时解决这两个问题吗?非常感谢

enter image description here enter image description here

3 个答案:

答案 0 :(得分:0)

在尝试了许多无法用于Geopandas和动画的方法之后,我最终找到了一种解决方案,使它成为将颜色条从动画功能与绘图的init功能分开的主要思想。

from matplotlib.animation import FuncAnimation
from IPython.display import HTML
from mpl_toolkits.axes_grid1 import make_axes_locatable


fig = plt.figure(figsize=(20,10)) 
ax1 = fig.add_subplot(1,1,1)

def animate(year):
        ax1.clear()
        eu_private_map.plot(color='gainsboro', ax=ax1, linewidth=0.6, edgecolor='1')
        sm = eu_private_map.dropna().plot(ax=ax1, column=year, vmin=0, vmax=30, cmap = 'viridis',
                                              legend=False, linewidth=0.6, edgecolor='1')
        ax1.set_title(year, fontdict={'fontsize': '23'})
        ax1.axis('off')

def init():
    # Create colorbar as a legend
    sm = plt.cm.ScalarMappable(cmap='viridis', norm=plt.Normalize(vmin=0, vmax=30))
    # empty array for the data range
    sm._A = []
    # add the colorbar to the figure

    divider = make_axes_locatable(ax1)
    cax = divider.append_axes("right", size="5%", pad=0.5)


    cbar = fig.colorbar(sm, cax=cax)
    cbar.ax.tick_params(labelsize=14) 


# the FuncAnimation function iterates through our animate function using the steps array
years = eu_private.columns.drop('country').tolist()[::-1]
ani = FuncAnimation(fig, animate, years, interval=1000, blit=False, init_func=init)

HTML(ani.to_jshtml())

答案 1 :(得分:0)

嘿, 找到了一种制作对数刻度色图的方法 norm=matplotlib.colors.LogNorm()可以达到目的:

A logarithmic colorbar in matplotlib scatter plot

,您还可以像这样添加vmin和vmax: norm=colors.LogNorm(vmin=vmin, vmax=vmax)

请记住,虽然它仅适用于vmin和vmax正值。例如。 norm=colors.LogNorm(vmin=0.1, vmax=1000000)

答案 2 :(得分:0)

对于遇到此问题的新答案寻求者,其想法是将 init_func 参数用于 FuncAnimation 函数。已回答 here

init_func 将呈现颜色条,而 animate 函数不会呈现颜色条。

限制:我假设颜色条及其刻度不会改变,这个答案将在更新图表轴时保持旧的颜色条不变。