zweite x Achse

Wie erstelle ich Grafiken, was ist zu beachten?

Moderatoren: EDi, jogo

retep
Beiträge: 99
Registriert: Do Sep 06, 2018 7:50 pm

zweite x Achse

Beitrag von retep »

Hallo,

ich wollte mich erneut mit einem Problem an die Community wenden. Das Problem hier ist dass ich gerne in die angefügte Grafik eine 2. x Achse einfügen würde. Die Befehlssequenz, welche# für die parallele y Achse problemlos funktioniert, geht hier nicht. Die Fehlermeldung, die
ausgegeben wird, interpretiere ich dahin gehend dass die Abstände der x-Achse (1) denen der x-Achse (2) zu ähnlich sind. Hat jemand eine Idee wie ich doch noch in die Grafik eine zweite x-Achse einfügen kann? Geht das überhaupt oder ist meine Idee sinnlos?

X Achse 1 sollte den Korrelationskoeffizenten von -1- +1 zeigen.
X Achse 2 sollte die sogenannte Sedimentationsrate von 0-2.5 zeigen.
Beide y Achsen sind genauso wie sie sein sollten.

Im weiteren Verlauf sollte der Single Ansatz zu einem Übersicht von 6 Grafiken führen. Deswegen ist in dem Code eine Zeile für facet_wrap drin.
Ich wollte erstmal die kleine Lösung probieren ehe ich an die große Lösung herangehe-

Hier mein Ansatz:

Code: Alles auswählen


K_Ti_mov.L%>%
ggplot(aes(y = Depth, x = value, colour = param)) +
  geom_path() +
  geom_point() +
  geom_vline(xintercept = 0, linetype = 2, color = "black", size = 1)+
  #facet_wrap(~param, scales = "free_x") +
  scale_y_reverse() +
  #labs(x = NULL, y = "Depth (cm)", colour = "CrossCorr")
  scale_y_reverse(limits = c(400, 175), 
                  breaks = seq(400, 175, by = -25),
                  sec.axis = sec_axis(
                    trans = ~approx(Age.single, xout = .)$y,
                    name = "Age (Ma)",
                    breaks = c(65, 67, 69, 71, 73, 75, 77, 79, 81, 83,85, 87, 89, 91, 93, 95)),
                  expand = c(0, 0)
  )
  
 #+

#scale_x_continuous(limits = c(-1, 1), 
                     #breaks = seq(-1, 1, by = 0.2), 
                     #sec.axis = sec_axis(
                     #trans = ~approx(SR.single, yout = .)$x,
                     #name = "SR (cm/ka)"),
                     #breaks = c(0, 0.2, 0.4, 0.6, 0.8, 1, 1.2, 1.4, 1.6, 1.8, 
                     #         2, 2.2, 2.4, 2.6),
                     #expand = c(0, 0)
 # )
  
# Fehlermeldung:
# Scale for 'y' is already present. Adding another scale for 'y', which will replace
# the existing scale.
# Fehler in scale_x_continuous(limits = c(-1, 1), breaks = seq(-1, 1, by = 0.2), :
# formales Argument "breaks" passt zu mehreren gegebenen Argumenten



Im Anhang sind als Textdateien die zugehörigen Files, welche bei der Grafik verwendet werden. Das beigegebene Bild ist das Ergebnis meines erfolglosen Versuches. Die Dateien in dem Zip File entsprechen exakt dem gezeigten Beispiel.

Vielen Dank im Voraus für Eure Hilfe!

retep
Dateianhänge
MW_Age vs. Depth.png
Grafik Dateien.zip
(1.83 KiB) 70-mal heruntergeladen
schubbiaschwilli
Beiträge: 253
Registriert: Di Jun 27, 2017 12:09 pm

Re: zweite x Achse

Beitrag von schubbiaschwilli »

Gude!

Vielleicht willst du eine zweite y-Achse (und vorher x und y vertauschen)? Vielleicht liegt es auch daran, dass ich mir kaum einen sinnvollen Plot mit 2 x-Achsen vorstellen kann - Und auch wenn ich mir deinen Plot anschaue, dann wäre es doch sinnvoll, x- und y-Achse zu vertauschen.

Dank&Gruß
Schubbiaschwilli
retep
Beiträge: 99
Registriert: Do Sep 06, 2018 7:50 pm

Re: zweite x Achse

Beitrag von retep »

Hallo,
Hab erstmal vielen Dank für deine Antwort! Und nein, ich möchte nicht die x und y Achse vertauschen! Das hat schon seinen Sinn! X-Achse Nr. 1 sollte komplett andere Daten anzeigen als x Achse Nr.2. Für mich geht es in erster Linie um einen visuellen Vergleich von 2 Datensätzen mit demselben Tiefen- und Altersprofil. Ich könnte natürlich auch einen simplen x,y Plot machen. Den kann ich immer noch machen. Aber hier steht in erster Linie der Versuch, visuell zu schauen ob sich beide Daten zu einander kompatibel verhalten. Sind ja noch andere Daten vorhanden. Die hier gezeigten Daten sind nur ein Ausriss aus dem Datensatz.

Vielen Dank & Grüße
schubbiaschwilli
Beiträge: 253
Registriert: Di Jun 27, 2017 12:09 pm

Re: zweite x Achse

Beitrag von schubbiaschwilli »

Gude!

Hm, meinst du dann vielleicht einen "Horizontal Bar Plot"?

https://rstudio-pubs-static.s3.amazonaw ... 67895.html
(Kann man bestimmt entsprechend formatieren.)

Dank&Gruß
Schubbiaschwilli
retep
Beiträge: 99
Registriert: Do Sep 06, 2018 7:50 pm

Re: zweite x Achse

Beitrag von retep »

Hej,

Danke für deine Antwort und Mühe! Nein, leider nicht! Ich versuche es kurz zu erklären. Linke bzw. rechte Achse zeigt dir die Tiefe bzw. das dazu gehörige Alter. Die rote Punktlinie stellt Korrelationskoeffizienten von -1 bis +1 dar. Die grüne Linie sind Sedimentationsraten. Den Korrelationskoeffizienten liegen Elementverhältnisse zugrunde. Ich will wissen ob mit der einhergehenden Änderung in der Sedimentationsrate sich auch der Korrelationskoeffizient ändert, denn eine Änderung desselben muss auf eine Änderung des Elementverhältnisses zurückzuführen sein. Was logisch wäre! Wie gesagt, ein x-y Plot täte es auch. Ich habe aber gehofft es im Profil visuell nachvollziehen zu können. Deswegen die doppelte x Achse. Oben die Sedimentationsrate, welche unglücklicherweise so gering ist, dass diese fast denselben Bereich der Korrelationskoeffizienten von -1 bis +1 abbildet. Das ist der Grund für die Fehlermeldung! R weist darauf hin, dass die Werte fast identisch sind.

Wie komme ich aus der Nummer raus? Oder gibt es hierfür überhaupt keine Hoffnung meine Vorstellung umzusetzen? Ich hatte gehofft dass ich durch eine fast identischen Code mit dem obigen Code (wie für das Alter) die doppelte x Achse für die Sedimentationsrate darstellen kann. Leider kommt es dann zu der vorher beschriebenen Fehlermeldung.

Code für doppelte x-Achse:

Code: Alles auswählen

scale_x_continuous(limits = c(-1, 1),                                         # sind die Koordinaten für die untere x Achse
                       breaks = seq(-1, 1, by = 0.2),                                 
                       sec.axis = sec_axis(
                       trans = ~approx(SR.single, yout = .)$x,             # Sedimentationsrate mit der dazugehörigen Datei SR.single
                       name = "SR (cm/ka)"),
                       breaks = c(0, 0.2, 0.4, 0.6, 0.8, 1, 1.2, 1.4, 1.6, 1.8, # breaks für die Darstellung der oberen x-Achse
                                2, 2.2, 2.4, 2.6),
                       expand = c(0, 0)
Nochmals vielen Dank für deine Mühe & Geduld,

retep
schubbiaschwilli
Beiträge: 253
Registriert: Di Jun 27, 2017 12:09 pm

Re: zweite x Achse

Beitrag von schubbiaschwilli »

Gude!

Ich verstehe, was du willst: Du willst visuell 'beweisen', dass die rote und grüne Linie deckungsgleich sind oder irgendwie (linear?) zusammenhängen - Dafür würde m.E. ein normaler Scatterplot ausreichen (ich nehme an, das meinst du mit 'x-y Plot').
Alles andere ist ja - hm - überleg mal: Du willst den Plot mit der roten Linie über den mit der roten Linie legen, und die x- und y-Achsen soweit dehnen und stauchen, bis die Linien passen - Kann man mathematisch machen (also berechnen), und somit auch plotten, aber du hast dann an allen 4 Seiten eine Achse, von denen 2 zu einer der beiden Linien passen. Kann man sicher Plotten, aber - Puh, da blickt doch niemand durch.
Zudem: Ist dir aufgefallen, dass in deinem Plot an der rechten Seite ('Age (M)') die Abstände nicht gleich sind? Ist das gewollt?

Dank&Gruß
Schubbiaschilli
retep
Beiträge: 99
Registriert: Do Sep 06, 2018 7:50 pm

Re: zweite x Achse

Beitrag von retep »

Hej,

exakt du hast es richtig verstanden! Das Alter auf der linken Achse ist den Tiefen auf der rechten Achse angenähert, deswegen steht der Befehl:

Code: Alles auswählen

trans = ~approx(Age.single, xout = .)$y,
in der Zeile.

Die jeweiligen Sedimentschichten zeigen eine unterschiedliche Mächtigkeit, deswegen ist auch das Alter nie in regelmäßigen Abständen. Im Gegensatz zum Beispiel zu einer Probennahme, welche möglichst gleichmäßig das Profil (Bohrkern) abdecken sollte.

Das ich für das Alter denselben Datensatz für die Tiefe wie für die Korrelationen bzw. Sedimentationsraten verwende, stimmen die Abstände ziemlich gut überein.

Ich will ja nix quetschen und kneten wie es passt (keine Fake-News)! Sondern versuchen die Sedimentationsrate auf der oberen x-Achse abzubilden. Dann hat man auf einem Blick darüber ob sich tatsächlich ein Trend mit der Änderung in der Sedimentationsrate auch der Korrelationskoeffizent ändert, abzeichnet. Was er müsste - meiner Meinung nach!

Ein xy Plot macht meiner Meinung nach keinen Sinn, weil ich dann unterschiedliche geologische Alter inklusive ihrer unterschiedlichen Sedimente in einen Topf "schmeiße". Und dann auch noch nach einem linearen Trend suche.
Ich kann das zwar mit Facets für jede Schicht oder Alter tun aber dann ist wieder die Anzahl der Proben zu unterschiedlich. Der Korrelationskoeffizent, welcher hier abgebildet wurde ist im Prinzip der gleitende Mittelwert aller Korrelationskoeffizenten am Profil für das jeweilige chemische Element. Dafür wurden i.d. R. 6-10 Messwerte zur Berechnung eines Korrelationskoeffizenten (Spearmen) herangezogen.

Nochmals vielen Dank für deine Geduld & Mühe

Grüße,

retep
schubbiaschwilli
Beiträge: 253
Registriert: Di Jun 27, 2017 12:09 pm

Re: zweite x Achse

Beitrag von schubbiaschwilli »

Gude!
Ein xy Plot macht meiner Meinung nach keinen Sinn, weil ich dann unterschiedliche geologische Alter inklusive ihrer unterschiedlichen Sedimente in einen Topf "schmeiße". Und dann auch noch nach einem linearen Trend suche.
Nun, aus mathematischer Sicht muss es ja keinen linearen Zusammenhang geben - Da ist ja mehr drin.

Fachlich ist ja 'was anderes' sinnvoller:
Das Alter auf der linken Achse ist den Tiefen auf der rechten Achse angenähert
Ich kann das jetzt fachlich nicht beurteilen, aber warum transformierst du dann deine 'Age (Ma)'-Achse für einen Scatterplot nicht wie schon bereits geschehen mit:

Code: Alles auswählen

trans = ~approx(Age.single, xout = .)$y,
Ob der Zusammenhang dann linear ist oder nicht wird man sehen - Aber du kannst dann ja Korrelationen usw. berechnen - Mit anderen Worten: Du kannst die entsprechenden Methoden nutzen.

Dank&Gruß
Schubbiaschilli
retep
Beiträge: 99
Registriert: Do Sep 06, 2018 7:50 pm

Re: zweite x Achse

Beitrag von retep »

Hej,

das verstehe ich jetzt nicht?
aber warum transformierst du dann deine 'Age (Ma)'-Achse für einen Scatterplot nicht wie schon bereits geschehen mit
.

Was hast du mit dieser Frage im Sinn?

Ich wollte mit demselben Befehl (ab Zeile 20) die x-Achse auf der oberen Seite plotten lassen. Aber das funktioniert nicht! Beim Ausführen kommt der Fehler welchen ich in meiner Eingangsmail zitiert habe. Wenn du die weg nimmst, läuft der Code nur bis Zeile 16 korrekt durch. Alles was mit # vermerkt ist, gibt mir den Fehler.

Vielen Dank für Geduld & Mühe,

retep
schubbiaschwilli
Beiträge: 253
Registriert: Di Jun 27, 2017 12:09 pm

Re: zweite x Achse

Beitrag von schubbiaschwilli »

Gude!

Lass es mich mal anders formulieren bzw. ich hab' noch mal nachgedacht und nachgeschlagen:
Wenn ich das richtig verstehe: Du hast einen Bohrkern (aus einem See oder so), und in diesem sind deine Sedimente so abgelagert, dass du die Jahre zählen kannst - Ähnlich wie bei der Dendrochronologie, dort kann man die Jahresringe zählen. Und ähnlich wie bei den Bäumen sind die Jahren unterschiedlich 'dick'. (Ich meine, mal gelesen zu haben, dass in der Dendrochronologie die 'Kleine Eiszeit' da so eine Art Referenzpunkt darstellt, da man diese gut erkennen kann.) Dies bedeutet aber, dass du diese Jahre genau zählen kannst bzw. musst, und die Länge des Bohrkerns/die Bohrtiefe(?) wegen der unterschiedlichen Dicke der einzelnen Jahre ein eher schlechter Schätzer ist.
Aber: Wenn wenn du diesen Sedimentschichten jetzt das Alter zuweisen kannst, dann rechne doch das eine in das andere um (was du in dem Plot ja schon gemacht hast), und mache dann einen Scatterplot.
Also: Fangen wir in deinem Plot mal oben an: Depth ist ca. 200 Age, ca. 86; Correlation (rot) ist ca. 0,4; SR (grün) ca. 0,6.
Jetzt rechnest du Depth in Age um oder umgekehrt - Wurde ja schon gemacht.
Jetzt kannst du 2 Dinge tun:
a) Du plottest Depth oder Age als x, und Correlation und SR als y - Das gibt den Plot um 90 Grad gedreht. Wenn du dann für Correlation und SR 2 verschiedene Achsen machst, hast du das ursprünglich gewünschte.
b) Du Plottest die Paare von Correlation und SR (die du ja hast) als Scatterplot - Und berechnest die Korrelation, schaust dir die Zusammenhänge an usw.

Dank&Gruß
Schubbiaschwilli

Nachtrag: Auch hier sind Drogen (Weissbier) im Spiel.
Edit: Ein paar Tippfehler...
Antworten