matplotlib.pyplt

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
eisley
User
Beiträge: 8
Registriert: Dienstag 29. April 2014, 20:18

Hallo zusammen ..

ich habe ein kleines script erstellt, um aus netCDF4 daten die ozeantiefe darzustellen. es soll nur dazu dienen, eine kleine übersicht über die daten zu erhalten..

Code: Alles auswählen

import matplotlib
matplotlib.use('Qt4Agg')

import matplotlib.pyplot as plt
import numpy as np
from netCDF4 import Dataset
from numpy import *

rootgrp=Dataset('MeineDaten', 'r', fromat='NETCDF4')

plt.figure()
plt.pcolor(rootgrp.variables['MeineVariable'][0,0,:,:])
plt.colorbar()
matplotlib.pyplot.autoscale(enable=True, axis='both', tight=True)
#plt.show(block=False)
plt.savefig('MeinBild.png', format='png')
das erstellte bild zeigt korrekt die ozeantiefe auf der karte an, allerdings auf dem kopf. weiss gerade jemand, warum? ich habe in versch. manuals nachgeschaut.. aber irgendwie noch nicht das richtige gefunden.

lon/lat sind mit den daten hinterlegt - habe da etwas herumgespielt.. führte aber nicht zur gewünschten abbildung.

im voraus lieben dank für eure hilfe
eisley
BlackJack

@eisley: Die Daten werden wahrscheinlich ganz einfach so vorliegen. Wenn Du Dir die Breitengrade auf der Achse auftragen lässt, dann wird man das wahrscheinlich daran auch sehen.

Edit: Vielleicht solltest Du Dir einfach mal die Dokumentation zu `pcolor()` durchlesen.
eisley
User
Beiträge: 8
Registriert: Dienstag 29. April 2014, 20:18

hey BlackJack

danke für deine schnelle Antwort .. ich habe die Dokumentation natürlich gelesen. Mein Problem ist, dass lon bzw. lat vorliegen als

lon(y, x)
lat(y, x)

ich möchte das umwandeln in lon(x, y) bzw. lat(x, y) .. das habe ich nicht geschafft. Ist das überhaupt ohne weiteres möglich? meine python-kenntnisse halten sich noch in grenzen :).

lieben dank!
BlackJack

@eisley: Was denn nun, sind X und Y vertauscht, oder stört es Dich das von unten nach oben geplottet wird? Für letzteres müsstest Du die Daten horizontal spiegeln, für ersteres transponieren.

Code: Alles auswählen

In [6]: A
Out[6]: 
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])

In [7]: numpy.flipud(A)
Out[7]: 
array([[20, 21, 22, 23, 24],
       [15, 16, 17, 18, 19],
       [10, 11, 12, 13, 14],
       [ 5,  6,  7,  8,  9],
       [ 0,  1,  2,  3,  4]])

In [8]: A.transpose() # oder A.T
Out[8]: 
array([[ 0,  5, 10, 15, 20],
       [ 1,  6, 11, 16, 21],
       [ 2,  7, 12, 17, 22],
       [ 3,  8, 13, 18, 23],
       [ 4,  9, 14, 19, 24]])
eisley
User
Beiträge: 8
Registriert: Dienstag 29. April 2014, 20:18

Hallo BlackJack

die daten zu transponieren wäre das, was ich suche. habe nun noch einmal die dokumentation gelesen und ziemlich lange herumprobiert .. :K
hat nicht funktioniert. das ist mein aktueller code..

Code: Alles auswählen

import matplotlib
matplotlib.use('Qt4Agg')

import matplotlib.pyplot as plt
import numpy as np
from netCDF4 import Dataset

data=Dataset('MeinDatensatz', 'r', fromat='NETCDF4')


a = data.variables['lat'][:,:]
b = data.variables['lon'][:,:]

r = np.flipud(a)
s = np.flipud(b)

data.variables['lat'] = np.transpose(r)
data.variables['lon'] = np.transpose(s)


plt.figure()
plt.pcolor(data.variables['MeineVariableTiefe'][0,0,:,:])
plt.colorbar()
matplotlib.pyplot.autoscale(enable=True, axis='both', tight=True)
#plt.show(block=False)
plt.savefig('depth_test1.png', format='png')
es ist das erste mal, dass ich mit python arbeite - ich versuchte wirklich, das hinzukriegen.
lieben dank
eisley.
BlackJack

@eisley: Ich sehe jetzt nicht wo Du die *Daten* die geplottet werden spiegelst oder transponierst. Mit `lat` und `lon` machst Du letztendlich beim Plot nichts. Und da sehe ich auch nicht was das Transponieren bringen sollte. Und das ”zurückschreiben” in `data`, solange man das nicht auch tatsächlich wieder speichern möchte, macht auch nicht wirklich Sinn.

Falls Du als `format` übrigens tatsächlich etwas anderes als den Default-Wert 'NETCDF4' haben möchtest, solltest Du das Argument besser richtig schreiben. ;-)

Dann stellt sich noch die Frage warum Du immer die ``:`` bei den Index/Slice-Zugriffen verwendest. Hast Du dafür tatsächlich einen Grund oder ist das eine Angewohnheit die Du von Matlab übernommen hast? Das macht bei `numpy` in der Regel keinen Sinn komplette Slices ”von allem” zu erstellen, weil man da einfach nur den gleichen View auf die Daten bekommt, die man sowieso schon hatte. Ungetestet:

Code: Alles auswählen

import matplotlib
matplotlib.use('Qt4Agg')
import matplotlib.pyplot as plt
import numpy as np
from netCDF4 import Dataset


def main():
    dataset = Dataset('MeinDatensatz')
    plt.figure()
    plt.pcolor(np.flipud(dataset.variables['MeineVariableTiefe'][0, 0]))
    plt.colorbar()
    matplotlib.pyplot.autoscale(enable=True, axis='both', tight=True)
    #plt.show(block=False)
    plt.savefig('depth_test1.png')


if __name__ == '__main__':
    main()
eisley
User
Beiträge: 8
Registriert: Dienstag 29. April 2014, 20:18

:idea: jetzt hats geklappt! ich hatte eine völlig falsche vorstellung von den 'operationen' .. und haste recht, da sind viele gewohnheiten :)
hab nun noch einmal ein python tutorial durchgearbeitet und konnte zusammen mit deiner hilfe das korrekte bild rechnen lassen...

lieben lieben dank!
eisley
Antworten