Fehler nach Update auf 3.7

Probleme bei der Installation?
Antworten
JaKu
User
Beiträge: 2
Registriert: Montag 2. März 2020, 09:45

Hallo,

ich habe ein Skript (nicht von mir), dass Daten plottet und die Diagramme in einem PDF ausgibt. Die PDF-Seite ist so aufgebaut, dass 2x4 Diagramme daruf angeordnet sind.
In Python 3.6 funktioniert das auch alles wie gewünscht. Jetzt habe ich allerdings auf meinem Rechner Python 3.7 installiert und dort gibt es Probleme mit dem Layout. Der Befehl "tight_layout" kann nicht angewand werden und daher überschneiden sich die verschiedenen Plots in der Figure. Ich habe auch schon an einen Istallationsfehler gedacht, aber anderes funktioniert problemlos; auch der Befehl "tight_layout" funktioniert in anderen Zusammenhängen.

Hat jemand eine Idee, ob sich hier was von 3.6 zu 3.7 geändert haben könnte, oder woran es ansonsten liegt?
Ich bin natürlich auch offen für andere Lösungsvorschläge, würde nur ungern alles komplett ändern.

Liebe Grüße und schon mal vielen Dank!

Die Fehlermeldung/Warnung (ich weiß nicht, wie ich Nummerierungen mit einfüge. Die betreffende Zeile befindet sich aber ziemlich am Ende):
H:/.../pandaImport.py:692: UserWarning: Tight layout not applied. tight_layout cannot make axes width small enough to accommodate all axes decorations
plt.tight_layout(h_pad=2)

Der betroffene Skriptausschnitt:

Code: Alles auswählen

def print_pdf2(path_list, data_mess, page_appendix, page_number, N_Mess):   
    name_pdf = 'temp_Messung' + str(data_mess.loc['Nr']) + '.pdf'
    print('*' * 20)
    print(name_pdf)
    print('*' * 20)
    pdf_pages = PdfPages(name_pdf)
    logo = mpimg.imread(control_dat.logo_path)

    # Generate the pages
    nb_plots = len(path_list)
    column_number = 0
    plotnumber = 1

#     Number of dias per page, if not in the protocol it will be calculated
    if math.isnan(data_mess.loc['nb_plots_per_page']):
        nb_plots_per_page = calc_row(nb_plots)
    else:
        nb_plots_per_page = 8

    grid_size = (control_dat.row_per_page, control_dat.colums_per_page)

    for i, samples in enumerate(path_list):
        # Create a figure instance (ie. a new page) if needed
        row_number = i % int(nb_plots_per_page/2)
        if i % nb_plots_per_page == 0:
            fig = plt.figure(figsize=control_dat.figsize, dpi=control_dat.dpi)
            column_number = 0
        if row_number == 0 and column_number < 2 and i % nb_plots_per_page > 0:
            column_number = column_number + 1
            plotnumber = plotnumber + 1
            # read data for file
        data, para, para_tmp2 = read_data(path_list[i])
        # plot the data
        grid_position = get_position(nb_plots_per_page, column_number, row_number)
        plt.subplot2grid(grid_size, grid_position, colspan=control_dat.col_span, rowspan=control_dat.row_span)
        # except the Overall and Average if exist
        if para['OVERALL'] is not None:
            over = '\n  Overall: ' + str(round(float(para['OVERALL']), 3)) + para['yUnit'] + ', '
        else:
            over = '\n'
        if para['Average'] is not None:
            av = 'Average: ' + str(int(para['Average'])) + ', '
        else:
            av = '\n'
        # if time function then no average output but maximum amplitude
        if 'Time' in para['label']:
            av = '\n'
            MaxAmp = np.sqrt(np.max( data * data))
            ma = '\n  Max Amplitude: ' + str(round(float(MaxAmp), 3)) + para['yUnit']
        else:
            ma = ''
        if 'PowerSpec' in para['label']:
            x_list = data.index.tolist()
            y_list = data["y"].tolist()
            max_y_list=max(y_list)
            index_EF=y_list.index(max_y_list)
            EF = x_list[index_EF]
            ef = '\n  max. ' + str(round(float(max_y_list), 4)) + para['yUnit'] + ' bei ' + str(round(float(EF), 3)) + para['xUnit'] #+ ', \n' + win
        else:
            ef = ''

        # title
        color, label = assign_chanel(data_mess, para['label'])
        title1 = para['fileName'] + ': ' + label

        # Plot
        print(title1)
        if 'Octave' in str(para['label']):
            x = data.index.values
            y = data.loc[:,'y']
            plt.bar(x, y, width=0.1*np.array(x), ec="k", align="edge")
            plt.xscale('log')
        elif 'COH' in str(para['label']):
            plt.rc('axes.formatter', useoffset=False)
            plt.plot(data, linewidth=1, color=color)
        else:
            plt.plot(data, linewidth=1, color=color)

        plt.title(title1, fontsize=control_dat.title_fontsize)
        #       Set axis Labels
        plt.xlabel('[' + para['xUnit'] + ' ] ' + ma + over + av + ef, fontsize=control_dat.label_fontsize)
        yLabel = assign_yLabel(data_mess, para, para_tmp2, para['label'])
        plt.ylabel (yLabel, fontsize=control_dat.label_fontsize)
        

        if (i + 1) % nb_plots_per_page == 0 or (i + 1) == nb_plots:
            #Txt creation for suptitle
            if N_Mess == '' or N_Mess == 'Bezeichnung der Messung eingeben':
                txt1 = 'Messung ' + str(data_mess.loc['Nr']) + '\n'
            else:
                txt1 = str(N_Mess) + ', ' + 'Messung ' + str(data_mess.loc['Nr']) + '\n'
            Erreg = data_mess.loc['Erregung']
            if len(Erreg) > 65:
                pos=[]
                for m in re.finditer(' ',Erreg):
                    if m.start() < 65:
                        pos.append(m.start())
                p=pos[-1]
                Ertmp=Erreg +' '
                Ertmp1=Ertmp[0:p]
                Ertmp2=Ertmp[p+1:]
                Ertmp=Ertmp1 +'\n' + Ertmp2
                Erreg=Ertmp
            txt2 = 'Erregung: ' + str(Erreg) + '\n'
            
            if str(data_mess.loc['Kommentar']) == 'nan':
                txt3 = ''
            else:
                txt3 = str(data_mess.loc['Kommentar'])
            txt = '\n' + txt1 + txt2 + txt3

            # set suptitle
            fig.suptitle(txt, fontsize=control_dat.fontsize_sub)
            plt.tight_layout(h_pad=2) #line 692 DIESER BEFEHL KANN NICHT ANGEWANDT WERDEN

            # LOGO
            sub1 = plt.subplot2grid(grid_size, (1, 9), colspan=3)
            sub1.imshow(logo)
            sub1.axis('off')


            #Footer
            footer = ' '*110+ page_appendix + str(page_number) + '\n' + control_dat.get_footer()
            fig.text(.1, 0, footer, size=control_dat.size)
            pdf_pages.savefig(fig)
            page_number += 1
            column_number = 0

    
    #  Write the PDF document to the disk
    pdf_pages.close()
    plt.close('all')
    return page_number, name_pdf[code]
Benutzeravatar
__blackjack__
User
Beiträge: 13925
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@JaKu: Sind die ganzen Bibliotheken die verwendet werden auch in der gleichen Version wie unter Python 3.6? Da würde ich als erstes ansetzen. In 3.6 mal mit ``python3.6 -m pip freeze`` eine Liste erstellen und dann in Python 3.7 mit einem leeren ``venv`` anfangen und dort die benötigten Bibliotheken in den gleichen Versionen installieren. Oder zumindest `matplotlib` mal auf den gleichen Stand in beiden Installationen bringen.

Edit: Ansonsten, da das nicht von Dir ist: Dem Autor sagen, dass sein Programm unter 3.7 dieses Verhalten zeigt.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
JaKu
User
Beiträge: 2
Registriert: Montag 2. März 2020, 09:45

Hallo __blackjack__,
vielen Dank für die schnelle Antwort.
Es sind in dem Fall zwei verschiedene Anaconda-Distributions installiert, daher gehe ich davon aus, dass die Bibliotheken auch andere Versionen haben. Die Version von 'matplotlib' ist in jedem Fall eine andere (3.1.1 & 2.0.0). Ich werde deinen Tipp mal versuchen und die alte Version der Bibliotheken bzw. von 'matplotlib' nutzen.

"Edit: Ansonsten, da das nicht von Dir ist: Dem Autor sagen, dass sein Programm unter 3.7 dieses Verhalten zeigt."
Das wäre eine schöne Sache, da ich das Problem dann einfach abschieben könnte ^^, aber leider ist der Autor dafür nicht mehr erreichbar...
Antworten