Fehler bei matplotlib

Probleme bei der Installation?
Antworten
BigBoy
User
Beiträge: 9
Registriert: Montag 11. Dezember 2017, 19:01

Hallo,
Ich beschäftige mich seit kurzen mit Python 2.7.14 und wolle nun einen Graphen anzeigen lassen. Das Problem welches ich jetzt habe ist, dass wenn ich das Programm starte eine Fehlermeldung bekomme und nicht weiß wie ich das löse.

Ich hoffe ihr könnt mir mit diesem Fehler helfen.

Ich danke euch schon mal im Vorraus.

Hier mein Program

Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 5, 0.1)
y = np.sin(y)
plt.plot(y)
plt.show()
Hier der Fehler

Code: Alles auswählen

Traceback (most recent call last):
  File "C:/Python27/plot_test.py", line 6, in <module>
    plt.plot(x,y);
  File "C:\Python27\lib\site-packages\matplotlib\pyplot.py", line 3229, in plot
    ax = gca()
  File "C:\Python27\lib\site-packages\matplotlib\pyplot.py", line 959, in gca
    return gcf().gca(**kwargs)
  File "C:\Python27\lib\site-packages\matplotlib\pyplot.py", line 588, in gcf
    return figure()
  File "C:\Python27\lib\site-packages\matplotlib\pyplot.py", line 534, in figure
    **kwargs)
  File "C:\Python27\lib\site-packages\matplotlib\backend_bases.py", line 170, in new_figure_manager
    return cls.new_figure_manager_given_figure(num, fig)
  File "C:\Python27\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 1049, in new_figure_manager_given_figure
    window = Tk.Tk(className="matplotlib")
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1824, in __init__
    self.readprofile(baseName, className)
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1876, in readprofile
    class_tcl = os.path.join(home, '.%s.tcl' % className)
  File "C:\Python27\lib\ntpath.py", line 85, in join
    result_path = result_path + p_path
UnicodeDecodeError: 'ascii' codec can't decode byte 0xf6 in position 17: ordinal not in range(128)
Zuletzt geändert von BigBoy am Montag 11. Dezember 2017, 19:24, insgesamt 1-mal geändert.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Tja - irgendwo in deinem nicht gezeigten Programm hast du einen Encoding-Error.
BigBoy
User
Beiträge: 9
Registriert: Montag 11. Dezember 2017, 19:01

Entschuldigung, da habe ich den doch glatt vergessen. Ich habe ihn jetzt hinzugefügt.
Benutzeravatar
noisefloor
User
Beiträge: 3829
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

die Fehlermeldung passt immer noch nicht zum gezeigten Programm. 1. hast du im Listing keine Zeile `plt.plot(x,y)` - da tritt aber der Fehler aus. 2. tritt der Fehler bei besagtem Befehl in Zeile 6 auf - da steht aber `plt.show()`.

Also entweder muss du die zum Code passenden Fehlermeldung zeigen oder andersrum. Ab so wie gerade bringt das nix.

Gruß, noisefloor
BigBoy
User
Beiträge: 9
Registriert: Montag 11. Dezember 2017, 19:01

Gott, Ich sollte echt langsam mal ins Bett gehen. So jetzt nochmal. Jetzt sollte alles passen.

Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 5, 0.1)
y = np.sin(x)
plt.plot(y)
plt.show()

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Python27\plot_test.py", line 6, in <module>
    plt.plot(y)
  File "C:\Python27\lib\site-packages\matplotlib\pyplot.py", line 3229, in plot
    ax = gca()
  File "C:\Python27\lib\site-packages\matplotlib\pyplot.py", line 959, in gca
    return gcf().gca(**kwargs)
  File "C:\Python27\lib\site-packages\matplotlib\pyplot.py", line 588, in gcf
    return figure()
  File "C:\Python27\lib\site-packages\matplotlib\pyplot.py", line 534, in figure
    **kwargs)
  File "C:\Python27\lib\site-packages\matplotlib\backend_bases.py", line 170, in new_figure_manager
    return cls.new_figure_manager_given_figure(num, fig)
  File "C:\Python27\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 1049, in new_figure_manager_given_figure
    window = Tk.Tk(className="matplotlib")
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1824, in __init__
    self.readprofile(baseName, className)
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1876, in readprofile
    class_tcl = os.path.join(home, '.%s.tcl' % className)
  File "C:\Python27\lib\ntpath.py", line 85, in join
    result_path = result_path + p_path
UnicodeDecodeError: 'ascii' codec can't decode byte 0xf6 in position 17: ordinal not in range(128)
Zuletzt geändert von BigBoy am Montag 11. Dezember 2017, 20:23, insgesamt 1-mal geändert.
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

Das sieht für mich so aus, als würde Tkinter nicht richtig mit dem Encoding einer Nicht-ASCII-Zeichenkette umgehen. Kann es sein, dass du ein Sonderzeichen (vielleicht ein „ö“?) in deinem Benutzernamen hast?

Edit: Die Fehlermeldung passt übrigens immer noch nicht zum gezeigten Code, der hat nämlich kein Semikolon in Zeile 6.

Außerdem ist es keine gute Idee, eigene Programme im Python-Installationsverzeichnis abzulegen.
BigBoy
User
Beiträge: 9
Registriert: Montag 11. Dezember 2017, 19:01

Leider nicht
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

Und in dem Verzeichnis, aus dem du das Programm aufrufst?
BigBoy
User
Beiträge: 9
Registriert: Montag 11. Dezember 2017, 19:01

Ich habe nur den Unterstrich im Projektnamen.
Benutzeravatar
noisefloor
User
Beiträge: 3829
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

also unter Python 3.5 auf Ubuntu 16.04 funktioniert der Code wie gezeigt.

Was ich gerade auch nicht verstehe: y enthält nur Zahlen, von den ASCII-Zeichen her also nur 0-9 und den Punkt. Das kann IMHO den Fehler in der Zeile `plt.plot(y)` doch gar nicht generieren?

Gruß, noisefloor
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

@BigBoy: Was sagt das Programm, wenn du über die Imports folgendes einfügst:

Code: Alles auswählen

import os
print os.environ.get("HOME", "HOME not present")
print os.curdir
@noisefloor: Der Fehler tritt im Tk-Backend von matplotlib auf, in dieser Methode, die nichts mit dem Plot an sich zu tun hat. Zumindest verstehe ich den Traceback so.
BigBoy
User
Beiträge: 9
Registriert: Montag 11. Dezember 2017, 19:01

Das Ergebnis ist C:\Users\Mein Name\AppData\Roaming\SPB_Data

Allerdings ist in meinem Namen ein ö
Benutzeravatar
noisefloor
User
Beiträge: 3829
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@narpfel: ja, verstehe ich auch so. Es wundert mich trotzdem, dass das Modul an so was scheitert...

@BigBoy: wenn du folgenden Code ausführst:

[codebox=pycon file=Unbenannt.txt]>>> import os
>>> os.environ['HOME'][/code]
Ist dann in der Ausgabe ein nicht-ASCII Zeichen wie äöüß?

Gruß, noisefloor
BigBoy
User
Beiträge: 9
Registriert: Montag 11. Dezember 2017, 19:01

@noisefloor Ja. Da ist eins in meinem Namen.
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

Also ist in deinem Benutzernamen ein „ö“.

Anscheinend hat Tkinter ein Problem damit. Geht es, wenn du das Programm mit `python -E` aufrufst? Das verhindert, dass Tkinter versucht, Konfigurationsdateien aus deinem HOME-Verzeichnis zu lesen. Allerdings führt das auch dazu, dass Python einige potentiell wichtigen Umgebungsvariablen ignoriert.

Alternativ könntest du ein anderes matplotlib-Backend benutzen. Dazu müsstest du allerdings GTK oder Qt installieren.

Als dritte Alternative könntest du einen Benutzernamen ohne Nicht-ASCII-Zeichen benutzen.
Benutzeravatar
noisefloor
User
Beiträge: 3829
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

oder du nimmst Python 3, da sollte das auch kein Problem sein.

Da Python 2.7 ja sowie in nicht allzu langer Zeit EOL ist, spricht das so wie so für den Wechsel - sofern du nicht #ausgründen unbedingt Python 2.7 brauchst.

Gruß, noisefloor
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

@noisefloor: matplotlib verwendet `unicode_literals` und damit versucht `os.path.join`, den `latin_1`-kodierten Bytestring (?), den `os.environ["HOME"]` zurückgibt, mit dem ASCII-Codec zu dekodieren, um das `+` auszuführen.

@BigBoy: Wenn du Python 2.7 nicht unbedingt brauchst, würde ich auch zu Python 3 raten.
BigBoy
User
Beiträge: 9
Registriert: Montag 11. Dezember 2017, 19:01

Danke für die Hilfe. Ich habe Python jetzt auf meinem zweiten Rechner installiert und dort läuft jetzt alles.
BigBoy
User
Beiträge: 9
Registriert: Montag 11. Dezember 2017, 19:01

Ein Wechsel auf Python 3 lohnt sich jetzt nicht mehr. Ich brauche das nur für ein einziges Projekt und danach deinstalliere ich es wieder, da ich in meiner Freizeit nicht programmiere.
Antworten