ax[1] 图未显示
ax[1] figure is not shown
我正在尝试在循环中创建一个倍数。第一个循环通过添加某些图(在本例中为两个图)创建上图(ax[0]
),同时第二个循环(ax[1]
)创建下图,只有一个图。
在第二次循环的第一次迭代后,保存图形并重置第二个图形(ax[1]
)。重复该过程,直到达到第二个循环的最后一次迭代。
for i in objetos: # Each object contains first upper figure info as lists of lists
data_sets = i.getProcesados() # For labeling
fechas = i.getFechas() # List of dates
promedios = i.getPromedios() # List of values
agregado = i.getAgregado() # For labeling
fig, ax = plt.subplots(2, 1, figsize = (18,13), sharex = True)
fig.subplots_adjust(hspace=0)
# FIRST LOOP -----> CREATES THE UPPER FIGURE ---------------------------------
for fecha,valor,label in zip(fechas,promedios,data_sets):
ax[0].plot_date(fecha, valor, label = label)
ax[0].legend(framealpha=1, borderpad = 0.7, frameon = True,
labelspacing = 0.7, fontsize = 17, loc='best')
# First axis (ax[0]) configuration:
x_minima = int(min([j[0] for j in fechas]))
x_maxima = int(max([j[-1] for j in fechas]))
ax[0].set_xticks(range((x_minima),(int(x_maxima)),60))
ax[0].set_xlim(x_minima,x_maxima)
ax[0].tick_params(labelsize=17)
months = mdates.MonthLocator(interval=2)
months_fmt = mdates.DateFormatter('%m')
ax[0].xaxis.set_minor_locator(months)
ax[0].xaxis.set_minor_formatter(months_fmt)
ax[0].grid(axis='y')
ax[0].grid(which='minor')
ax[0].set_title((i.getAgregado() + " (" + "Zona de " + zona + ")" + "\n"), fontsize = 24)
ax[0].set_ylabel("Deformación (cm)", fontsize = 22, labelpad = 11)
# SECOND LOOP -----> CREATES THE LOWER FIGURE ---------------------------------
piezos, registros = Piezo.EsteAgregado(agregado) # Object provinding information
for l in piezos.Piezometro:
serie = registros.loc[l]
dates = list(serie.Fechas) # List of dates
values = list(serie.Cota_piezométrica) # List of values
etiqueta = 'P - ' + str(l) # For labeling
ax[1].plot_date(dates, values, '#040405', label = etiqueta, lw=2)
ax[1].set_xlim(x_minima,x_maxima)
# Second axis (ax[1]) configuration:
years = mdates.YearLocator()
years_fmt = mdates.DateFormatter('\n%Y')
ax[1].xaxis.set_major_locator(years)
ax[1].xaxis.set_major_formatter(years_fmt)
months = mdates.MonthLocator(interval=2)
months_fmt = mdates.DateFormatter('%m')
ax[1].xaxis.set_minor_locator(months)
ax[1].xaxis.set_minor_formatter(months_fmt)
ax[1].tick_params(which = 'major', labelsize=17)
ax[1].tick_params(which = 'minor', labelsize=15,)
ax[1].legend(framealpha=1, borderpad = 0.7, frameon = True,
labelspacing = 0.7, fontsize = 18, loc='best')
ax[1].grid(axis='y')
ax[1].grid(which='minor')
ax[1].set_ylabel("Piezometría (m)", fontsize = 22, labelpad = 11)
# Figure saving:
directorio = os.path.dirname(nombreSalida)
dir_destino = os.path.join(directorio, ("Gráficas " + zona + "/"))
if not os.path.isdir(dir_destino):
os.makedirs(dir_destino)
imagen = (i.getAgregado() + '-P-' + str(l) + ".png")
plt.savefig(dir_destino + imagen)
plt.cla() # Close last axis
plt.clf()
plt.close(fig)
不过,只显示上图。我不知道会发生什么,所以我真的很感激有人的帮助。
一件奇怪的事情是 plt.show()
仅在尚未到达第二个循环时才起作用;在第二个循环中,plt.show()
不起作用。在嵌套循环之外,第二个循环图显示正确。
This link允许查看错误结果。
问题解决了。如果有人感兴趣,图中没有显示,因为日期是 pandas 格式。我不得不通过以下代码行将它们转换为 matplotlib 格式(即数字格式):
dates = [date2num(datetime.strptime(i,'%Y-%m-%d')) for i in dates]
我正在尝试在循环中创建一个倍数。第一个循环通过添加某些图(在本例中为两个图)创建上图(ax[0]
),同时第二个循环(ax[1]
)创建下图,只有一个图。
在第二次循环的第一次迭代后,保存图形并重置第二个图形(ax[1]
)。重复该过程,直到达到第二个循环的最后一次迭代。
for i in objetos: # Each object contains first upper figure info as lists of lists
data_sets = i.getProcesados() # For labeling
fechas = i.getFechas() # List of dates
promedios = i.getPromedios() # List of values
agregado = i.getAgregado() # For labeling
fig, ax = plt.subplots(2, 1, figsize = (18,13), sharex = True)
fig.subplots_adjust(hspace=0)
# FIRST LOOP -----> CREATES THE UPPER FIGURE ---------------------------------
for fecha,valor,label in zip(fechas,promedios,data_sets):
ax[0].plot_date(fecha, valor, label = label)
ax[0].legend(framealpha=1, borderpad = 0.7, frameon = True,
labelspacing = 0.7, fontsize = 17, loc='best')
# First axis (ax[0]) configuration:
x_minima = int(min([j[0] for j in fechas]))
x_maxima = int(max([j[-1] for j in fechas]))
ax[0].set_xticks(range((x_minima),(int(x_maxima)),60))
ax[0].set_xlim(x_minima,x_maxima)
ax[0].tick_params(labelsize=17)
months = mdates.MonthLocator(interval=2)
months_fmt = mdates.DateFormatter('%m')
ax[0].xaxis.set_minor_locator(months)
ax[0].xaxis.set_minor_formatter(months_fmt)
ax[0].grid(axis='y')
ax[0].grid(which='minor')
ax[0].set_title((i.getAgregado() + " (" + "Zona de " + zona + ")" + "\n"), fontsize = 24)
ax[0].set_ylabel("Deformación (cm)", fontsize = 22, labelpad = 11)
# SECOND LOOP -----> CREATES THE LOWER FIGURE ---------------------------------
piezos, registros = Piezo.EsteAgregado(agregado) # Object provinding information
for l in piezos.Piezometro:
serie = registros.loc[l]
dates = list(serie.Fechas) # List of dates
values = list(serie.Cota_piezométrica) # List of values
etiqueta = 'P - ' + str(l) # For labeling
ax[1].plot_date(dates, values, '#040405', label = etiqueta, lw=2)
ax[1].set_xlim(x_minima,x_maxima)
# Second axis (ax[1]) configuration:
years = mdates.YearLocator()
years_fmt = mdates.DateFormatter('\n%Y')
ax[1].xaxis.set_major_locator(years)
ax[1].xaxis.set_major_formatter(years_fmt)
months = mdates.MonthLocator(interval=2)
months_fmt = mdates.DateFormatter('%m')
ax[1].xaxis.set_minor_locator(months)
ax[1].xaxis.set_minor_formatter(months_fmt)
ax[1].tick_params(which = 'major', labelsize=17)
ax[1].tick_params(which = 'minor', labelsize=15,)
ax[1].legend(framealpha=1, borderpad = 0.7, frameon = True,
labelspacing = 0.7, fontsize = 18, loc='best')
ax[1].grid(axis='y')
ax[1].grid(which='minor')
ax[1].set_ylabel("Piezometría (m)", fontsize = 22, labelpad = 11)
# Figure saving:
directorio = os.path.dirname(nombreSalida)
dir_destino = os.path.join(directorio, ("Gráficas " + zona + "/"))
if not os.path.isdir(dir_destino):
os.makedirs(dir_destino)
imagen = (i.getAgregado() + '-P-' + str(l) + ".png")
plt.savefig(dir_destino + imagen)
plt.cla() # Close last axis
plt.clf()
plt.close(fig)
不过,只显示上图。我不知道会发生什么,所以我真的很感激有人的帮助。
一件奇怪的事情是 plt.show()
仅在尚未到达第二个循环时才起作用;在第二个循环中,plt.show()
不起作用。在嵌套循环之外,第二个循环图显示正确。
This link允许查看错误结果。
问题解决了。如果有人感兴趣,图中没有显示,因为日期是 pandas 格式。我不得不通过以下代码行将它们转换为 matplotlib 格式(即数字格式):
dates = [date2num(datetime.strptime(i,'%Y-%m-%d')) for i in dates]