pcolormesh

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
möppi
User
Beiträge: 39
Registriert: Samstag 29. März 2014, 09:18

Hi,
Ich möchte einen farbkodierten Plot erstellen. Mir wurde dafür pcolormesh empfohlen. Ich habe zwei Listen/numpyarrays x=[.....] und y=[.....] mit len(x)=n und len(y)=m
Daraus ergeben sich die Koordinaten [x1,y1], [x1,y2],.....,[x1,ym],.......,[x2,y1],......,[x2,ym],......,[xn,y1],.....[xn,ym]. Außer dem habe ich eine Funktion f(x,y) die an den jeweiligen Koordinaten ausgewertet werden soll (was mir auch gelungen ist) (also len(f)=n*m)). Nun sollen die Punkte f über x und y farbkodiert dargestellt werden. Wie genau mache ich das? Dieses Problem unterscheidet sich von anderen Problemstellungen dahingehend, dass man sonst üblicherweise zwei Wertebereiche x und y hat und eine Funktion die in diesem Wertebereich "direkt" auswertet. Alle dazwischen liegenden Werte werden im Plot automatisch interpoliert.
Ich möchte allerdings nur eine Punktmenge plotten.

Danke für eure Hilfe
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Hier ein kleines pcolormesh Beispiel:

Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt

def f(x,y):
    return np.sin(x + y**2)

x_1d = np.linspace(-4,4,100)
y_1d = np.linspace(-2,2, 50) 
x_2d, y_2d = np.meshgrid(x_1d, y_1d)
f_values = f(x_2d, y_2d)

plt.figure()
plt.pcolormesh(x_1d, y_1d, f_values)
plt.colorbar()
plt.show()
pcolormesh interpoliert nicht, sondern stellt die Daten so dar wie sie sind. Bei colorbar kannst Du zwischen verschiedenen Farbverteilungen wählen oder Dir selbst eine definieren:
http://matplotlib.org/examples/color/co ... rence.html
a fool with a tool is still a fool, www.magben.de, YouTube
möppi
User
Beiträge: 39
Registriert: Samstag 29. März 2014, 09:18

Hallo Mag Ben,

Vielen Dank für deine Antwort. Ich habe schon eine Meinungsverschiedenheit mit einem Kollegen gehabt, was unter dem Begriff "Interpolation" zu verstehen ist. Ich weiß nicht wie pcolormesh im Detail arbeitet aber, letztendlich ist es meiner Meinung nach eine Interpolation, weil man ja nicht einer diskreten Menge von Punkten eine Farbe zuordnet, sondern auch dazwischen liegenden Werten. Das wäre sowas wie eine "konstante interpolation" (kann man sich vielleicht wie bei einem Histogramm vorstellen)

Um auf das Problem zurück zu kommen. Ich hatte schon ein ähnliches Musterbeispiel, wie du es mir gezeigt hast, das ich allerdings nicht 100% auf mein spezifisches Problem übertragen kann. Deswegen meinte ich auch, dass ich meine Funktion nicht "direkt" auf die Punktmenge anwenden kann. Ich versuche es einmal in einem Pseudocode zu erklären. Die Abhängigkeiten von meiner Funktion sind ziemlich kompliziert:

f(xi,yi,parameter1(xi,y1,y2,....yn),parameter2(xi,y1,y2,....yn),......)
return Wert(parameter1,parameter2,....,xi,yi)

Menge(xi) und Menge(yi) sind arrays oder listen. Natürlich kann man daraus irgendwie eine Funktion konstruieren, die das leistet, aber ich bin auch damit nicht auf einen grünen Zweig gekommen.

Eine "indirekte" Auswertung ist jedoch möglich.
Das Problem konnte ich umgehen, in dem ich mir das Ausgabeformat von deiner Funktion angeschaut habe. Das steht doch sowas wie:

np.array([[f(x1,y1),f(x1,y2),...,f(x1,ym)],[f(x2,y1),f(x2,y2),.....,f(x2,ym)],......[f(xn,y1),f(xn,y2),......f(xn,ym)]])

oder liege ich falsch? Ich kann so ein Array auch mit meiner routine erzeugen, ohne meshgrid zu verwenden, aber da kommt jedes mal eine Fehlermeldung raus.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

möppi hat geschrieben:Ich habe schon eine Meinungsverschiedenheit mit einem Kollegen gehabt, was unter dem Begriff "Interpolation" zu verstehen ist. Ich weiß nicht wie pcolormesh im Detail arbeitet aber, letztendlich ist es meiner Meinung nach eine Interpolation, weil man ja nicht einer diskreten Menge von Punkten eine Farbe zuordnet, sondern auch dazwischen liegenden Werten. Das wäre sowas wie eine "konstante interpolation" (kann man sich vielleicht wie bei einem Histogramm vorstellen)
OK, so gesehen ist es eine Interpolation. Was ich meinte, es werden keine allmählichen Farbübergänge erzeugt. Gnuplot macht das nämlich so. Ich habe mal ein paar Gnuplot-Plots mit pcolormesh ersetzt. Danach haben sich die Anwender darüber beschwert, dass da mitten im ansonsten gleichmäßigen Farbverlauf unschöne Farbklekse waren. Das waren Ausreißer in den Daten. Gnuplot hat diese verwischt und damit versteckt, pcolormesh hat sie dagegen gezeigt.
möppi hat geschrieben:Das Problem konnte ich umgehen, in dem ich mir das Ausgabeformat von deiner Funktion angeschaut habe. Das steht doch sowas wie:

np.array([[f(x1,y1),f(x1,y2),...,f(x1,ym)],[f(x2,y1),f(x2,y2),.....,f(x2,ym)],......[f(xn,y1),f(xn,y2),......f(xn,ym)]])
Meine Funktion f(x,y) hat genau das Ausgabeformat von x und y. Sind x,y Skalare, dann ist f(x,y) skalar. Sind x,y 1D-Arrays, dann ist f(x,y) ein 1D-Array. Sind x,y 2d-Arrays, dann ist f(x,y) ein 2D-Array. Das funktioniert so, weil f(x,y) mit Numpy-Funktionen aufgebaut ist. Ist f(x,y) nicht mit Numpy-Funktionen aufgebaut, dann musst Du das 2D-Array der Funktionswerte schlimmstenfalls in einer Schleife über x und y füllen. Für pcolormesh ist es einfach nur wichtig, zwei 1D-Arrays für die x- und y-Werte und ein 2D-Array für die Funktionswerte zu bekommen, nicht wie Du diese Arrays erzeugt hast.
möppi hat geschrieben:aber da kommt jedes mal eine Fehlermeldung raus.
Fehlermeldungen immer schön posten.
a fool with a tool is still a fool, www.magben.de, YouTube
möppi
User
Beiträge: 39
Registriert: Samstag 29. März 2014, 09:18

Das hier ist die Fehlermeldung. Wenn dir diese Meldung nicht weiterhilft, dann werde ich mein Problem noch weiter ausführen müssen.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 540, in runfile
execfile(filename, namespace)
File "C:/Users/X/Desktop/Python/scripts/script5.py", line 81, in <module>
plt.pcolormesh(x,y,z)
File "C:\Python27\lib\site-packages\matplotlib\pyplot.py", line 2946, in pcolormesh
ret = ax.pcolormesh(*args, **kwargs)
File "C:\Python27\lib\site-packages\matplotlib\axes.py", line 7736, in pcolormesh
X, Y, C = self._pcolorargs('pcolormesh', *args, allmatch=allmatch)
File "C:\Python27\lib\site-packages\matplotlib\axes.py", line 7351, in _pcolorargs
numRows, numCols = C.shape
AttributeError: 'list' object has no attribute 'shape'
Zuletzt geändert von möppi am Montag 13. Oktober 2014, 11:51, insgesamt 3-mal geändert.
möppi
User
Beiträge: 39
Registriert: Samstag 29. März 2014, 09:18

Sorry, habe einen Fehler gefunden, habe aber auch so gleich eine neue Fehlermeldung bekommen:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 540, in runfile
execfile(filename, namespace)
File "C:/Users/X/Desktop/Python/scripts/script5.py", line 81, in <module>
plt.pcolormesh(x,y,z)
File "C:\Python27\lib\site-packages\matplotlib\pyplot.py", line 2946, in pcolormesh
ret = ax.pcolormesh(*args, **kwargs)
File "C:\Python27\lib\site-packages\matplotlib\axes.py", line 7736, in pcolormesh
X, Y, C = self._pcolorargs('pcolormesh', *args, allmatch=allmatch)
File "C:\Python27\lib\site-packages\matplotlib\axes.py", line 7377, in _pcolorargs
C.shape, Nx, Ny, funcname))
TypeError: Dimensions of C (4, 501) are incompatible with X (4) and/or Y (501); see help(pcolormesh)
>>>
Zuletzt geändert von möppi am Montag 13. Oktober 2014, 11:51, insgesamt 1-mal geändert.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

möppi hat geschrieben:ypeError: Dimensions of C (4, 501) are incompatible with X (4) and/or Y (501); see help(pcolormesh)
Du musst Dein Funktionswerte 2D-Array transponieren, dann sollte es funktionieren.
a fool with a tool is still a fool, www.magben.de, YouTube
möppi
User
Beiträge: 39
Registriert: Samstag 29. März 2014, 09:18

Ich verwende denselben Plot-Befehl wie du, also

Code: Alles auswählen

plt.figure()
plt.pcolormesh(x,y,z)
plt.colorbar()
plt.show()
Ich habe mir alle Daten ausgeben lassen, sowohl die Dimension, den Datentyp und die Daten an sich:

Code: Alles auswählen

print len(x)
print type(x)
print x
print len(y)
print type(y)
print y
print len(z)
print len(z[0])
print type(z)
print z
print z[0]
Unter folgendem Link, kann man sich das anschauen:
http://www.python-forum.de/pastebin.php?mode=view&s=407
Zuletzt geändert von möppi am Montag 13. Oktober 2014, 11:52, insgesamt 2-mal geändert.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Es kommt nicht auf die Daten von Deinem z an, sondern auf z.shape. Folgendes muss gelten:

Code: Alles auswählen

(y.size, x.size) == z.shape
Du hast aber

Code: Alles auswählen

(x.size, y.size) == z.shape
Probier mal

Code: Alles auswählen

plt.pcolormesh(x,y,z.T)
a fool with a tool is still a fool, www.magben.de, YouTube
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

möppi hat geschrieben:Anscheinend kann man keine Textdatei hochladen, deswegen muss ich wohl leider die Daten hier rein kopieren:
Mal ganz kurz off-topic, damit das ganze noch leserlich bleibt: Oben auf der Seite gibt es einen Pastebin-Link, dort kannst du Daten hochladen und dann hier im Forum verlinken. Außerdem unterstützt das Forum Code-Tags, damit der Code richtig dargestellt wird und er auch korrekt lesbar ist. In MagBens Beiträgen hast du das ja schon gesehen. Der entsprechende Button ist über dem Nachrichtentextfeld und heißt "Code". Setze doch bitte deinen Code und deine Fehlermeldung bitte immer in entsprechende Tags. Es wäre super, wenn du deine Beiträge hier im Thread noch entsprechend editieren würdest.
Das Leben ist wie ein Tennisball.
möppi
User
Beiträge: 39
Registriert: Samstag 29. März 2014, 09:18

@Mag Ben:

Geil. Es funktioniert. Vielen Dank
Antworten