dicc_dias = {0: 'Lu', 1: 'Ma', 2: "Mi", 3: "Ju", 4: "Vi", 5:"Sa" , 6: "Do"}
def crea_grafica_evolucion(ageb_origen):
fig = plt.figure()
gs = plt.GridSpec(20, 30)
ax1 = fig.add_subplot(gs[0:9, 0:9])
ax2 = fig.add_subplot(gs[11:20, 0:9])
ax3 = fig.add_subplot(gs[0:20, 10:20])
ax4 = fig.add_subplot(gs[0:9, 20:30])
ax5 = fig.add_subplot(gs[11:20, 20:30])
fig.subplots_adjust(wspace=110)
fig.set_size_inches(20, 10)
df_origen = df.xs(ageb_origen, axis=0, level='sourceid')
# Diario
agrup_fecha = df_origen.groupby('fecha')[['tiempo']].mean()
agrup_fecha.unstack()['tiempo'].plot(ax=ax1)
agrup_fecha.rolling(7).mean().plot(ax=ax1)
ax1.legend(['Diario', 'promedio semanal'])
ax1.set_ylabel('minutos')
ax1.set_ylim(0, 40)
ax1.set_title('Tiempo promedio a todos los destinos', fontsize=14)
ax1.set_xlabel('')
# Dia de la semana
agrup_dia = df_origen.groupby(['n_dia_sem', 'dia'])[['tiempo']].mean()
agrup_dia.reset_index('n_dia_sem').plot.bar(y='tiempo', ax=ax2, legend=False)
ax2.set_ylim(0, 40)
ax2.set_ylabel('minutos')
ax2.set_xlabel('')
ax2.set_title('Tiempo promedio por día de la semana', fontsize=14)
# Calendario
heat_data = df_origen.groupby(['n_semana', 'n_dia_sem'])[['tiempo']].mean().unstack('n_semana')['tiempo'].T\
.rename(columns=dicc_dias)
ax = sns.heatmap(heat_data, linewidths=.5, cmap='viridis_r', vmin=20, vmax=35, ax=ax3)
ax.set_yticklabels(ax.get_yticklabels(), rotation=0)
ax = linea_division_meses(ax, no_semana=5, no_dia=4)
ax = linea_division_meses(ax, no_semana=9, no_dia=4)
ax.set_title('Tiempo promedio a todos los destinos (minutos)', fontsize=14, y=1.03)
ax.xaxis.set_ticks_position('top')
ax.set_ylabel('')
ax.set_xlabel('')
ax_twin = ax.twinx()
ax_twin.yaxis.grid(False)
ax_twin.set_ylim(0, 13)
ax_twin.set_yticks([2, 6.5, 11])
ax_twin.set_yticklabels(reversed(['Ene', 'Feb', 'Mar']))
ax_twin.yaxis.set_ticks_position('left')
ax_twin.yaxis.set_label_position('left')
ax_twin.spines['left'].set_position(('outward', 25))
# Tiempo diario por zona
df_origen.groupby(['fecha', 'zona'])['tiempo'].mean().unstack('zona').rolling(7).mean().plot(ax=ax4)
ax4.set_ylim(0, 60)
ax4.set_title('Tiempo promedio, por zona de destino', fontsize=14)
ax4.set_xlabel('')
ax4.legend(ncol=3, loc=(0, 0.05))
ax4.set_ylabel('minutos (media movil 7 días)', fontsize=12)
# Mapa de zonas
colonias.boundary.plot(color='k', ax=ax5, lw=0.2)
norte.boundary.plot(color='C1', ax=ax5, label='Norte', lw=0.2, zorder=-1)
sur.boundary.plot(color='C4', ax=ax5, label='Sur', lw=0.2, zorder=-1)
poniente.boundary.plot(color='C3', ax=ax5, label='Poniente', lw=0.2, zorder=-1)
oriente.boundary.plot(color='C2', ax=ax5, label='Oriente', lw=0.2, zorder=-1)
centro.boundary.plot(color='C0', ax=ax5, label='Centro', lw=0.2, zorder=-1)
agebs.loc[[str(ageb_origen)]].plot(color='red', ax=ax5, zorder=10)
ax5.legend(bbox_to_anchor=(1.4, 0.7))
ax5.set_axis_off()
#Titulo y guardado
zona_origen = ageb_to_nombre[ageb_origen]
fig.text(x=0, y=-0.1, s='Elaborado por @jjsantoso con datos de Uber Movements', fontdict={'size': 9}, transform=ax.transAxes)
fig.suptitle(f'Todos los viajes de UBER con origen en {zona_origen} (Movement ID {ageb_origen}), 2019-1T', fontsize=18)
figname = f'graficas/evolucion_diaria_{zona_origen}_2019T1.png'
fig.savefig(figname, dpi=300, bbox_inches='tight')
print('Guardada en:', figname)