vmin, vmax = np.log10(100), np.log10(10000) fig = plt.figure(figsize=(12, 7)) ax1 = fig.add_axes((0.1, 0.5, 0.8, 0.35)) ax2 = fig.add_axes((0.1, 0.1, 0.8, 0.35)) cax = fig.add_axes((0.91, 0.2, 0.02, 0.5)) ax2.set_xlabel('Azimuth [deg]') ax1.set_ylabel('Elevation [deg]') for ax in [ax1, ax2]: ax.set_xlim((-180, 180)) ax.set_ylim((0, 90)) ax.set_xticks(range(-150, 180, 30)) ax.set_yticks(range(0, 91, 30)) ax.set_aspect('equal') ax.grid() points1 = ax1.scatter( pos_horiz_parkes[:, 0, 0], pos_horiz_parkes[:, 1, 0], c=np.log10(pos_horiz_parkes[:, 2, 0]), cmap='viridis', vmin=vmin, vmax=vmax, ) points2 = ax2.scatter( pos_horiz_effbg[:, 0, 0], pos_horiz_effbg[:, 1, 0], c=np.log10(pos_horiz_effbg[:, 2, 0]), cmap='viridis', vmin=vmin, vmax=vmax, ) cbar = fig.colorbar(points1, cax=cax) cbar.set_label('Distance (km)') cbar.set_ticks([2, 3, 4]) cbar.set_ticklabels([100, 1000, 10000]) ax1.text(-170, 75, 'Parkes 64-m', fontsize=16) ax2.text(-170, 75, 'Effelsberg 100-m', fontsize=16) title = ax1.text( 174, 75, '{:%y/%m/%d %H:%M:%S}'.format(times[0].datetime), fontsize=15, ha='right' ) def init(): points1.set_offsets(pos_horiz_parkes[:, 0:2, 0]) points1.set_array(np.log10(pos_horiz_parkes[:, 2, 0])) points2.set_offsets(pos_horiz_effbg[:, 0:2, 0]) points2.set_array(np.log10(pos_horiz_effbg[:, 2, 0])) title.set_text('{:%y/%m/%d %H:%M:%S}'.format(times[0].datetime)) return points, title def animate(i): points1.set_offsets(pos_horiz_parkes[:, 0:2, i]) points1.set_array(np.log10(pos_horiz_parkes[:, 2, i])) points2.set_offsets(pos_horiz_effbg[:, 0:2, i]) points2.set_array(np.log10(pos_horiz_effbg[:, 2, i])) title.set_text('{:%y/%m/%d %H:%M:%S}'.format(times[i].datetime)) return points, title anim = animation.FuncAnimation( fig, animate, init_func=init, frames=pos_horiz_parkes.shape[2], interval=20, blit=True ) # this takes a while! plt.close(anim._fig) anim