首页 > 解决方案 > ax[1] 图未显示

问题描述

我正在尝试在循环中创建多个图形。第一个循环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()不起作用。在嵌套循环之外,正确显示了第二个循环图。

此链接允许查看错误结果。

标签: pythonmatplotlibnested-loopsaxis

解决方案


问题解决了。万一有人感兴趣,图中没有显示,因为日期是熊猫格式的。我不得不通过以下代码行将它们转换为 matplotlib 格式(即数字格式):

dates = [date2num(datetime.strptime(i,'%Y-%m-%d')) for i in dates]

推荐阅读