【问题标题】:Python - Animate basemap scatterplotPython - 动画底图散点图
【发布时间】:2017-11-17 00:17:21
【问题描述】:

我有一个形状为 (14403, 438) 的 DataFrame,它由经度和纬度以及值组成。数据框如下:

我将坐标绘制为:

# define map colors
land_color = '#f5f5f3'
water_color = '#cdd2d4'
coastline_color = '#f5f5f3'
border_color = '#bbbbbb'
meridian_color = '#f5f5f3'
marker_fill_color = '#0000ff'
marker_edge_color = 'None'

# create the plot
fig = plt.figure(figsize = (15, 10))
ax = fig.add_subplot(111, facecolor = '#ffffff', frame_on = False)
ax.set_title('Transportable Array', fontsize = 24, color = '#333333')

#lon_0  center of desired map domain (in degrees).
#lat_0  center of desired map domain (in degrees).
#width  width of desired map domain in projection coordinates (meters).
#height height of desired map domain in projection coordinates (meters).

# draw the basemap and its features
m = Basemap(width = 5500000,height = 3300000,
            resolution = 'l', area_thresh = 1000., projection = 'lcc',\
            lat_1 = 45., lat_2 = 55, lat_0 = 37, lon_0 = -98.)
m.drawmapboundary(color = border_color, fill_color = water_color)
m.drawcoastlines(color = coastline_color)
m.drawcountries(color = border_color)
m.fillcontinents(color = land_color, lake_color = water_color)
m.drawparallels(np.arange(-90., 120., 30.), color = meridian_color)
m.drawmeridians(np.arange(0., 420., 60.), color = meridian_color)

# project the location history points then scatter plot them
x, y = m(stations.loc['longitude'].values, stations.loc['latitude'].values)
m.scatter(x, y, s = 8, color = marker_fill_color, edgecolor = marker_edge_color, alpha = 1, zorder = 3)

# show & save the map
plt.savefig('Transportable_Array.png', dpi = 96, bbox_inches = 'tight', pad_inches = 0.2)
plt.show()

我正在尝试创建一个动画,该动画将绘制每列的坐标,然后迭代索引中的值。最后,我试图让它遍历 14,403 行并根据值更改标记颜色。我目前甚至无法单独为坐标设置动画。

我希望能够实现 bqplot,但我在 GitHub 上关注的散点动画还没有工作。

地图目前如下所示。如果每个点的颜色都可以根据当前的迭代值波动,那就太酷了。

感谢您的阅读。

【问题讨论】:

    标签: python pandas animation coordinates matplotlib-basemap


    【解决方案1】:

    您可以为此使用 动画 模块。以下是一般步骤:

    1. 将值转换为颜色

    2. 每一步更新颜色

    3. 保存动画

    这里有一些代码:

    import matplotlib.pyplot as plt
    from mpl_toolkits.basemap import Basemap
    import matplotlib.animation as animation
    import numpy as np
    
    land_color = '#f5f5f3'
    water_color = '#cdd2d4'
    coastline_color = '#f5f5f3'
    border_color = '#bbbbbb'
    meridian_color = '#f5f5f3'
    marker_fill_color = '#0000ff'
    marker_edge_color = 'None'
    
    # Some dummy data
    longVals = np.random.uniform(-120,-80, 1000)
    latVals = np.random.uniform(35, 45, 1000)
    vals = np.random.uniform(size=(200,1000))
    
    # Be careful - the values that go into the colormap function
    #  must be integers between 0 and 254
    normalisedVals = 254*(vals-vals.min())/(vals.max()-vals.min())
    normalisedVals = normalisedVals.astype(np.int)
    cm = plt.cm.spectral_r
    
    
    fig = plt.figure(figsize = (15, 10))
    ax = fig.add_subplot(111, facecolor = '#ffffff', frame_on = False)
    ax.set_title('Transportable Array', fontsize = 24, color = '#333333')
    
    # draw the basemap and its features
    m = Basemap(width = 5500000,height = 3300000,
                resolution = 'l', area_thresh = 1000., projection = 'lcc',
                lat_1 = 45., lat_2 = 55, lat_0 = 37, lon_0 = -98.)
    m.drawmapboundary(color = border_color, fill_color = water_color)
    m.drawcoastlines(color = coastline_color)
    m.drawcountries(color = border_color)
    m.fillcontinents(color = land_color, lake_color = water_color)
    m.drawparallels(np.arange(-90., 120., 30.), color = meridian_color)
    m.drawmeridians(np.arange(0., 420., 60.), color = meridian_color)
    
    x, y = m(longVals, latVals)
    scat = m.scatter(x, y, s = 8, c = normalisedVals[0], edgecolor = marker_edge_color, alpha = 1, zorder = 3)
    
    
    def init():
        return scat,
    
    def animate(i):
        col = cm(normalisedVals[i])
        scat.set_color(col)
        return scat,
    
    anim = animation.FuncAnimation(fig, animate, init_func=init, frames=100, interval=20, blit=False, repeat=False)
    anim.save('animation.gif', writer='imagemagick', fps=60)
    

    我应该警告您,对于 14k 行,这将需要一段时间。 此外,由于更好的压缩,我建议保存为 mp4 而不是 gif。 如果您有任何问题,请告诉我!

    【讨论】:

    • 出色的工作,感谢您的评论,我很感激。这正是我正在寻找的。我无法将行值转换为我可以像你一样使用的东西。我应该将 DataFrame 行值分配给数组吗?
    • 这可能就是我会做的,你可以读出所有的行并将它们与 numpy.如果您对此有疑问,我可以提供一些代码来帮助您。
    • 太棒了,谢谢。我设法将它放入一个数组中,例如:vals = np.array(stations.iloc[2:].values),但是当它处理时我收到:Invalid RGBA argument: -9223372036854775808,我假设它正在尝试根据所有值创建一个 RGB 值。
    • 要将动画保存为 MP4,只需使用:anim.save('animation.mp4')
    • 好的 - 不知道为什么会这样。试试 np.max(...) 而不是 vals.max() 也许?
    猜你喜欢
    • 2019-12-28
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 2021-03-05
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    相关资源
    最近更新 更多