Blog

R Tutorial: oce

Dieses Tutorial basiert auf Arbeiten von BMARSYS-Studierenden im begleitenden Seminar zum DS2-Modul und wurde redaktionell überarbeitet.

Das R-Paket oce (von Dan Kelley und Clark Richards, Dalhousie University) ist das Standardwerkzeug für ozeanographische Datenanalyse in R. Es bietet spezialisierte Funktionen zum Einlesen, Verarbeiten und Darstellen von Messdaten aus verschiedenen ozeanographischen Instrumenten — insbesondere CTD-Sonden (Conductivity, Temperature, Depth), die zu den wichtigsten Messgeräten der physikalischen Ozeanographie zählen.

Warnung

oce überschreibt Standardfunktionen wie plot() und summary() mit paketspezifischen Versionen. Nach dem Laden von oce verhalten sich diese Funktionen bei oce-Objekten anders als gewohnt — sie erzeugen automatisch ozeanographisch sinnvolle Darstellungen.

Installation

# install.packages("oce")
library(oce)

Struktur von oce-Objekten

oce verwendet ein eigenes Objektsystem, das auf S4-Klassen basiert. Jedes oce-Objekt besteht aus drei Bereichen (Slots), die mit @ oder über Zugriffsfunktionen angesprochen werden:

  1. data — Enthält die eigentlichen Messdaten (Salinität, Temperatur, Druck, Tiefe etc.)
  2. metadata — Enthält Metadaten wie Einheiten, Stationsposition, Datum, Instrumententyp etc.
  3. processingLog — Dokumentiert automatisch alle Verarbeitungsschritte, die auf das Objekt angewendet wurden — nützlich für die Reproduzierbarkeit

Beispiel mit CTD-Daten

oce enthält mehrere Beispieldatensätze. Der Datensatz ctd ist ein einzelnes CTD-Profil. Mit dem [[-Operator lassen sich Variablen extrahieren — sowohl direkt gemessene als auch abgeleitete Größen (z.B. potenzielle Temperatur oder Dichte), die oce automatisch berechnet:

data(ctd)

# Übersicht — zeigt Variablen, Wertebereiche und Metadaten
summary(ctd)
CTD Summary
-----------

* Instrument:          SBE 25
* Temp. serial no.:    1140
* Cond. serial no.:    832
* File:                "/Users/kelley/git/oce/create_data/ctd/ctd.cnv"
* Original file:       c:\seasoft3\basin\bed0302.hex
* Start time:          2003-10-15 15:38:38
* Sample interval:     1 s
* Cruise:              Halifax Harbour
* Vessel:              Divcom3
* Station:             Stn 2
* Mean Location:       44.684N 63.644W
* Data Overview

                                Min.   Mean   Max. Dim. NAs OriginalName
    scan                         130    220    310  181   0         scan
    timeS [s]                    129    219    309  181   0        timeS
    pressure [dbar]             1.48 22.885 44.141  181   0           pr
    depth [m]                  1.468 22.698 43.778  181   0         depS
    temperature [°C, IPTS-68]  2.919 7.5063 14.237  181   0         t068
    salinity [PSS-78]         29.916 31.219 31.498  181   0        sal00
    flag                           0      0      0  181   0         flag

* Processing Log

    - 2018-11-14 20:03:47 UTC: `create 'ctd' object`
    - 2018-11-14 20:03:47 UTC: `read.ctd.sbe(file = file, debug = 10, processingLog = processingLog)`
    - 2018-11-14 20:03:47 UTC: `oce.edit(x = ctd, item = "startTime", value = as.POSIXct(gsub("1903",     "2003", format(ctd[["startTime"]])), tz = "UTC") + 4 * 3600,     reason = "file had year=1903, instead of 2003", person = "Dan Kelley")`
# Daten extrahieren mit [[]]
ctd[["temperature"]]
  [1] 14.221087 14.226486 14.225086 14.222187 14.226686 14.233184 14.192094
  [8] 14.112313 14.139706 14.119311 14.106414 14.099716 14.115612 13.266116
 [15] 13.373690 12.293949 12.110094 12.016016 12.010817 11.791870 11.734384
 [22] 11.630309 11.424558 11.440254 11.386567 11.292090 11.308986 11.237703
 [29] 10.938575 10.934376 10.812605 10.739722 10.542870 10.441594 10.229745
 [36] 10.031692  9.897325  9.698672  9.600996  9.549408  9.502219  9.501520
 [43]  9.461029  9.422839  9.389247  9.287171  9.159802  9.102115  9.110613
 [50]  9.025534  9.016536  8.987043  9.009538  8.965548  8.877169  8.826082
 [57]  8.755099  8.749500  8.679517  8.527253  8.539351  8.433876  8.442674
 [64]  8.317904  8.323502  8.211129  8.147745  8.075362  8.014377  7.944293
 [71]  7.969887  7.838719  7.777333  7.768935  7.734444  7.714249  7.703151
 [78]  7.717648  7.702851  7.701552  7.701452  7.694253  7.686255  7.680457
 [85]  7.684256  7.684656  7.683356  7.628669  7.577381  7.574082  7.544089
 [92]  7.543290  7.466508  7.397425  7.423418  7.390126  7.345037  7.306047
 [99]  7.281352  7.257158  7.265156  7.182576  7.179377  7.082600  7.019915
[106]  6.875150  6.898644  6.854055  6.844957  6.850556  6.843658  6.753179
[113]  6.755279  6.640706  6.547928  6.470247  6.452751  6.317684  6.135328
[120]  6.050748  5.897585  5.683136  5.675138  5.593857  5.566764  5.251640
[127]  5.094377  4.953211  4.859334  4.787051  4.801248  4.795949  4.747661
[134]  4.737963  4.678877  4.653183  4.548408  4.492722  4.455331  4.417540
[141]  4.349856  4.346457  4.316964  4.216388  4.247381  4.172199  4.179297
[148]  4.172899  4.162001  4.159902  4.165700  4.138207  3.974746  3.677617
[155]  3.555247  3.421879  3.404683  3.425378  3.372691  3.366792  3.382088
[162]  3.380189  3.373090  3.373890  3.368192  3.368392  3.376390  3.356394
[169]  3.265816  3.207430  3.200132  3.146945  3.092858  3.103955  3.063465
[176]  3.018875  3.001380  2.970987  2.935995  2.918300  2.918700
ctd[["salinity"]]
  [1] 29.9210 29.9205 29.9206 29.9219 29.9206 29.9164 29.9339 29.9667 29.9519
 [10] 29.9634 29.9699 29.9705 29.9618 30.3046 30.2732 30.7485 30.7636 30.7813
 [19] 30.7795 30.8467 30.8882 30.9301 30.8928 30.8872 30.9049 30.9166 30.9245
 [28] 30.9283 30.9801 30.9853 30.9895 30.9982 31.0359 31.0327 31.0883 31.1196
 [37] 31.0861 31.1802 31.1974 31.2066 31.2061 31.2120 31.2078 31.2148 31.2161
 [46] 31.2055 31.2630 31.2616 31.2549 31.2692 31.2737 31.2728 31.2660 31.2727
 [55] 31.2883 31.2944 31.3075 31.3102 31.3139 31.3010 31.2956 31.3575 31.3507
 [64] 31.3752 31.3595 31.3747 31.3661 31.3674 31.3832 31.3769 31.3684 31.3940
 [73] 31.3999 31.3996 31.4080 31.4014 31.4032 31.3970 31.3985 31.3983 31.3984
 [82] 31.3998 31.3959 31.3971 31.4152 31.4223 31.4124 31.4262 31.4238 31.4273
 [91] 31.4314 31.4289 31.4388 31.4449 31.4341 31.4437 31.4405 31.4428 31.4434
[100] 31.4458 31.4440 31.4551 31.4411 31.4501 31.4235 31.4508 31.4487 31.4459
[109] 31.4445 31.4416 31.4407 31.4428 31.4432 31.4368 31.4415 31.4768 31.4564
[118] 31.4384 31.4411 31.4485 31.4564 31.4616 31.4983 31.4486 31.4396 31.4699
[127] 31.3796 31.4313 31.4477 31.4343 31.4304 31.4270 31.4379 31.4289 31.4254
[136] 31.4280 31.4213 31.4228 31.4202 31.4236 31.4208 31.4152 31.4213 31.4197
[145] 31.4054 31.4171 31.4141 31.4126 31.4119 31.4092 31.4118 31.4058 31.4523
[154] 31.4412 31.4316 31.4133 31.4080 31.4087 31.4070 31.4045 31.4023 31.4014
[163] 31.3992 31.3990 31.3967 31.3974 31.3950 31.3988 31.3991 31.3952 31.3967
[172] 31.4104 31.3981 31.4212 31.4062 31.3938 31.3935 31.3886 31.3868 31.3955
[181] 31.3928
ctd[["pressure"]]
  [1]  1.480  1.671  2.052  2.243  2.624  2.672  3.005  3.196  3.482  3.720
 [11]  4.006  4.197  4.292  4.721  4.721  5.150  5.293  5.674  5.722  6.055
 [21]  6.198  6.437  6.770  6.961  7.199  7.342  7.437  7.819  8.057  8.295
 [31]  8.724  8.724  9.058  9.248  9.534  9.725 10.154 10.201 10.392 10.583
 [41] 10.916 11.107 11.488 11.727 11.870 12.060 12.346 12.489 12.918 13.109
 [51] 13.347 13.490 13.728 13.919 14.348 14.634 14.824 15.063 15.206 15.539
 [61] 15.635 16.016 16.207 16.445 16.588 16.874 17.160 17.208 17.637 17.875
 [71] 17.923 18.161 18.399 18.542 18.828 19.257 19.352 19.543 19.781 20.020
 [81] 20.210 20.830 20.878 21.116 21.354 21.545 21.831 22.212 22.355 22.546
 [91] 22.784 23.023 23.356 23.642 23.928 24.119 24.357 24.500 24.882 25.072
[101] 25.454 25.549 25.740 25.930 26.312 26.550 26.979 27.074 27.265 27.503
[111] 27.789 28.075 28.409 28.600 28.695 28.886 29.124 29.458 29.792 30.078
[121] 30.221 30.507 30.697 30.888 31.222 31.460 31.698 31.841 32.080 32.270
[131] 32.604 32.985 33.081 33.224 33.510 33.653 33.939 34.273 34.463 34.654
[141] 34.845 35.083 35.369 35.655 35.798 36.132 36.227 36.513 36.704 36.942
[151] 37.324 37.467 37.705 37.753 37.991 38.182 38.468 38.754 39.040 39.231
[161] 39.469 39.564 39.898 39.993 40.470 40.661 40.852 40.947 41.281 41.471
[171] 41.758 42.091 42.282 42.473 42.759 42.949 43.283 43.522 43.808 43.903
[181] 44.141
# Auch abgeleitete Größen sind verfügbar
ctd[["potential temperature"]]
  [1] 14.220882 14.226254 14.224802 14.221876 14.226322 14.232814 14.191678
  [8] 14.111872 14.139226 14.118798 14.105862 14.099138 14.115020 13.265492
 [15] 13.373063 12.293302 12.109435 12.015314 12.010110 11.791130 11.733629
 [22] 11.629529 11.423749 11.439422 11.385709 11.291219 11.308103 11.236779
 [29] 10.937640 10.933413 10.811601 10.738723 10.541845 10.440554 10.228687
 [36] 10.030628  9.896224  9.697580  9.599891  9.548287  9.501067  9.500346
 [43]  9.459820  9.421607  9.388003  9.285917  9.158529  9.100833  9.109286
 [50]  9.024195  9.015174  8.985669  9.008138  8.964133  8.875720  8.824609
 [57]  8.753615  8.747993  8.678003  8.525725  8.537811  8.432310  8.441089
 [64]  8.316310  8.321895  8.209508  8.146105  8.073727  8.012709  7.942613
 [71]  7.968199  7.837025  7.775626  7.767216  7.732703  7.712471  7.701367
 [78]  7.715844  7.701027  7.699706  7.699588  7.692334  7.684333  7.678513
 [85]  7.682289  7.682671  7.681346  7.626632  7.575341  7.572024  7.542015
 [92]  7.541194  7.464395  7.395298  7.421262  7.387958  7.342857  7.303860
 [99]  7.279137  7.254930  7.262893  7.180320  7.177105  7.080331  7.017626
[106]  6.872869  6.896322  6.851734  6.842622  6.848199  6.841278  6.750795
[113]  6.752865  6.638302  6.545537  6.467856  6.450345  6.315282  6.132942
[120]  6.048359  5.895220  5.680801  5.672788  5.591516  5.564404  5.249339
[127]  5.092104  4.950961  4.857090  4.784814  4.798983  4.793660  4.745377
[134]  4.735672  4.676583  4.650886  4.546121  4.490427  4.453034  4.415240
[141]  4.347563  4.344150  4.314646  4.214080  4.245056  4.169873  4.176963
[148]  4.170548  4.159642  4.157528  4.163300  4.135806  3.972377  3.675338
[155]  3.552991  3.419655  3.402448  3.423120  3.370433  3.364525  3.379803
[162]  3.377899  3.370783  3.371577  3.365853  3.366042  3.374026  3.354032
[169]  3.263465  3.205088  3.197776  3.144588  3.090510  3.101591  3.061100
[176]  3.016517  2.999009  2.968614  2.933620  2.915924  2.916311
ctd[["density"]]
  [1] 1022.228 1022.227 1022.229 1022.232 1022.231 1022.227 1022.250 1022.293
  [9] 1022.277 1022.291 1022.300 1022.303 1022.293 1022.728 1022.683 1023.258
 [17] 1023.305 1023.337 1023.337 1023.431 1023.474 1023.526 1023.536 1023.529
 [25] 1023.554 1023.580 1023.584 1023.601 1023.694 1023.700 1023.726 1023.745
 [33] 1023.810 1023.825 1023.905 1023.963 1023.960 1024.066 1024.096 1024.112
 [41] 1024.121 1024.126 1024.131 1024.144 1024.151 1024.159 1024.225 1024.234
 [49] 1024.229 1024.254 1024.260 1024.265 1024.257 1024.270 1024.297 1024.311
 [57] 1024.333 1024.337 1024.351 1024.365 1024.360 1024.425 1024.420 1024.458
 [65] 1024.446 1024.475 1024.479 1024.490 1024.514 1024.520 1024.510 1024.549
 [73] 1024.564 1024.565 1024.578 1024.578 1024.581 1024.575 1024.579 1024.580
 [81] 1024.581 1024.586 1024.585 1024.587 1024.602 1024.609 1024.602 1024.622
 [89] 1024.628 1024.632 1024.641 1024.640 1024.660 1024.675 1024.665 1024.678
 [97] 1024.682 1024.690 1024.696 1024.702 1024.701 1024.721 1024.711 1024.732
[105] 1024.721 1024.763 1024.760 1024.764 1024.765 1024.763 1024.765 1024.779
[113] 1024.781 1024.791 1024.807 1024.846 1024.833 1024.837 1024.863 1024.881
[121] 1024.906 1024.936 1024.967 1024.938 1024.936 1024.997 1024.943 1025.000
[129] 1025.025 1025.022 1025.019 1025.019 1025.033 1025.028 1025.033 1025.038
[137] 1025.045 1025.053 1025.056 1025.063 1025.069 1025.066 1025.075 1025.085
[145] 1025.071 1025.090 1025.087 1025.088 1025.089 1025.088 1025.092 1025.090
[153] 1025.144 1025.163 1025.168 1025.166 1025.165 1025.165 1025.170 1025.169
[161] 1025.167 1025.167 1025.167 1025.168 1025.169 1025.170 1025.168 1025.174
[169] 1025.183 1025.186 1025.189 1025.206 1025.202 1025.220 1025.213 1025.208
[177] 1025.211 1025.211 1025.213 1025.222 1025.221

Schnellvisualisierung

Die plot()-Funktion erzeugt für CTD-Objekte automatisch eine typische ozeanographische Vier-Panel-Darstellung: Temperatur, Salinität und Dichte jeweils gegen den Druck (als Proxy für die Tiefe), sowie ein T-S-Diagramm (Temperatur-Salinitäts-Diagramm) mit Isopyknen:

plot(ctd)

Daten einlesen und bearbeiten

Dateien lesen

Die Funktion read.oce() erkennt automatisch eine Vielzahl gängiger ozeanographischer Dateiformate — darunter Sea-Bird .cnv-Dateien, WOCE-Format, ODF und viele weitere. Man muss in der Regel nur den Dateipfad angeben:

# CTD-Daten aus einer Datei lesen
# d <- read.oce("meine_ctd_datei.cnv")

Daten modifizieren

oce-Objekte werden nicht direkt verändert, sondern über spezielle Funktionen modifiziert. oceSetData() fügt neue Variablen hinzu oder überschreibt bestehende, oceSetMetadata() ändert Metadaten. Beide Funktionen geben ein neues Objekt zurück:

# Neue Variable hinzufügen (Schallgeschwindigkeit)
ctd2 <- oceSetData(ctd, name = "soundSpeed", value = swSoundSpeed(ctd))

# Metadaten ändern (Stationsname)
ctd2 <- oceSetMetadata(ctd2, name = "station", value = "Station_01")

CTD-Daten trimmen und mitteln

Rohdaten von CTD-Messungen enthalten typischerweise Artefakte: Die Equilibrierungsphase (Sonde wird ins Wasser getaucht und equilibriert), der eigentliche Abwärtsprofil und die Aufholphase. Für die Analyse wird nur der Abwärtsprofil verwendet. ctdTrim() entfernt die unerwünschten Phasen automatisch. Anschließend werden die hochaufgelösten Daten mit ctdDecimate() auf regelmäßige Druckstufen gemittelt:

# Automatisches Trimmen — behält nur den Abwärtsprofil
ctd_trimmed <- ctdTrim(ctd)

# Auf regelmäßige Druckstufen mitteln (1 dbar ≈ 1 m Tiefe)
ctd_dec <- ctdDecimate(ctd_trimmed, p = 1) # 1 dbar Intervalle

Berechnungen für Meerwassereigenschaften

oce enthält eine umfangreiche Sammlung von Funktionen zur Berechnung thermodynamischer Meerwassereigenschaften nach den UNESCO-Gleichungen (EOS-80) und der neueren TEOS-10. Alle Funktionen beginnen mit dem Präfix sw (seawater). Die Eingabegrößen sind typischerweise Salinität (PSU), Temperatur (°C) und Druck (dbar):

# Dichte [kg/m³] — wichtig für die Schichtung des Ozeans
swRho(salinity = 35, temperature = 10, pressure = 100)
[1] 1027.404
# Potenzielle Temperatur [°C] — Temperatur, die ein Wasserpaket
# an der Oberfläche hätte (korrigiert für adiabatische Kompression)
swTheta(salinity = 35, temperature = 10, pressure = 100)
[1] 9.988453
# Gefriertemperatur [°C] — abhängig von Salinität und Druck
swTFreeze(salinity = 35, pressure = 0)
[1] -1.92184
# Schallgeschwindigkeit [m/s] — relevant für Echolot-Messungen
swSoundSpeed(salinity = 35, temperature = 10, pressure = 100)
[1] 1491.477
Tipp

Für eigene CTD-Daten können die sw*()-Funktionen auch direkt mit oce-Objekten aufgerufen werden, z.B. swSoundSpeed(ctd) — die benötigten Variablen werden automatisch extrahiert.

Schnittdarstellungen (Section Plots)

In der Ozeanographie werden häufig mehrere CTD-Stationen entlang einer Linie (Transekt) zu einem „Schnitt” (Section) zusammengefasst und als vertikaler Querschnitt dargestellt. oce enthält den Beispieldatensatz section — einen Schnitt durch den Atlantik mit über 100 Stationen.

Vor der Darstellung werden die Daten mit sectionGrid() auf ein regelmäßiges Druckgitter interpoliert, damit eine glatte Darstellung entsteht:

data(section)

# Auf regelmäßiges Druckgitter interpolieren (0–5000 dbar in 100-dbar-Schritten)
section_gridded <- sectionGrid(section, p = seq(0, 5000, 100))

# Temperaturschnitt — zeigt die Temperaturverteilung im Querschnitt
plot(section_gridded, which = "temperature")

# Salinitätsschnitt
plot(section_gridded, which = "salinity")

# Stationskarte — zeigt die geographische Lage der CTD-Stationen
plot(section, which = "map")

Karten und Projektionen

oce bietet eigene Kartenfunktionen, die verschiedene Kartenprojektionen unterstützen. Dies ist besonders nützlich für ozeanographische Karten in hohen Breiten, wo die Mercator-Projektion stark verzerrt. Die Projektionen werden im PROJ-Format angegeben:

# Weltkarte mit Mollweide-Projektion (flächentreu — gut für globale Darstellungen)
data(coastlineWorld)
mapPlot(coastlineWorld, projection = "+proj=moll")

# Stereographische Projektion (Nordpol) — ideal für arktische Darstellungen
mapPlot(coastlineWorld,
  projection = "+proj=stere +lat_0=90",
  longitudelim = c(-180, 180),
  latitudelim = c(60, 90)
)

Elemente auf der Karte platzieren

Mit mapPoints() und mapText() lassen sich Punkte und Beschriftungen auf der Karte platzieren. Die Koordinaten werden automatisch in die gewählte Projektion transformiert:

mapPlot(coastlineWorld, projection = "+proj=moll")
mapPoints(longitude = c(10, -74), latitude = c(53.5, 40.7), col = "red", pch = 19)
mapText(longitude = c(10, -74), latitude = c(55, 42), labels = c("Hamburg", "New York"))

Farbskalen

oce enthält spezialisierte Farbskalen für ozeanographische Größen (z.B. oceColorsTemperature, oceColorsSalinity, oceColorsDensity). Mit colormap() und drawPalette() lassen sich Farbskalen erstellen und als Legende darstellen:

# Farbskala erstellen aus den Temperaturdaten aller Stationen
temps <- unlist(section[["temperature", "byStation"]])
cm <- colormap(z = temps, col = oceColorsTemperature)
drawPalette(colormap = cm)

Weitere Datentypen

oce unterstützt neben CTD-Daten eine Vielzahl weiterer ozeanographischer Instrumente und Datentypen. Für jeden Typ gibt es spezialisierte read.*()-, plot()- und summary()-Funktionen:

  • Pegelstandsdaten (Sea-level): data(sealevel) mit plot(sealevel) — zeigt Gezeitenverläufe
  • ADCP-Daten (Acoustic Doppler Current Profiler): Strömungsprofile über die Tiefe
  • Drifter-Daten: Trajektorien von Oberflächendriftern
  • Argo-Floats: Autonome Tiefenprofile aus dem globalen Argo-Netzwerk

Weiterführende Ressourcen