3D mit Plotly

Wie erstelle ich Grafiken, was ist zu beachten?

Moderatoren: EDi, jogo

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

3D mit Plotly

Beitrag von retep »

Hallo,

ich habe da mal wieder eine Frage. Auch Dank der Hilfe, welche mir im Forum zuteil wurde komme ich als Anfänger sehr gut voran. Meine heutige Frage gilt dem Thema 3D surface plots mittels plotly:

Ich habe mit den Testdaten, welche den reellen Werte im Gelände nicht ganz unähnlich sind, versucht die gegen die Tiefe in einem 3D Surface zusammenzufassen siehe https://plot.ly/r/3d-surface-plots/. Erstens ist mir bei den gezeigten Beispielen (Nr. 1 Basic 3D Surface Plot) nicht ganz klar welche Daten hierfür für die Berechnung verwendet werden.

Dann habe ich versucht mit meinen eigenen Daten die Beispiele 2 (2D Kernel Density Estimation) und 3 (Multiple Surfaces)nachzubauen. Vor allem letzteren ist für mich von enormes Interesse, erlaubt diese Art von Beispielen die räumliche Darstellung von horizontalen Schichtungen. Also im meinem Fall der Durchlässigkeitsbeiwert (sog. Kf Wert m/s) oder auch andere Daten. Diese Art von Darstellung wäre für die Auswertung solcher Daten eine enorme Hilfe!

Leider funktioniert das ganze nicht so wie in dem Beipiel angeführt. Beim Beispiel 2 (2D Kernel Density Estimation auf der Webseite),rechnet R das Gitter aus, gibt aber nur die Tiefe in der Legende an. Das Gitter ist leer.

Im Fall des Beispiels Nr. 3 (Multiple Surfaces), wird der Plot zwar dargestellt, nur die Darstellung sieht etwas schräg aus.

Meine Fragen wären:

1. Weiß jemand welche Daten hinter dem Plot in Beipiel 1 (Basic 3D Surface Plot) und in welcher Form diese für den Plot aufbereitet wurden.

2. Für den Nachbau des Beipiels Nr. 2 (2D Kernel Density Estimation) habe ich folgende eigene Daten verwendet:

Code: Alles auswählen

x <-runif(301, min=0.000001, max=0.00001)
y <-runif(301, min=0.000001, max=0.00001)
z <- seq(0,30,0.1)
z<- as.matrix(z)
p <- list( x = x , y = y,  z = z)
p<- as.matrix(p)
p <- plot_ly(x = p$x, y = p$y, z = z) %>% add_surface()
p 
Im Ergebnis kommt ein leeres Gitter aber die Höhe bzw. Tiefe (30m) wird in der Legende angezeigt. Liegen meine
Testdaten evtl. in einem falschen Format vor? Was könnte der Grund für das leere Gitter sein? Außerdem nützt mir
in der Legende die Höhe nichts. Ich möchte eher das die sog. Kf- Wert - x,y in der Legende angezeigt werden.


3. Beim Nachbau des Beispiels Nr. 3 (Multiple Surfaces):

Code: Alles auswählen

# erste 1m
z <-c(
  c(8.753440e-06, 3.087675e-06, 0.0),
  c(2.354936e-06, 4.172422e-06, 0.1),
  c(4.809585e-06, 8.902687e-06, 0.2),
  c(7.300328e-06, 1.498156e-06, 0.3),
  c(2.918452e-06, 1.915362e-06, 0.4),
  c(5.005054e-06, 2.203559e-06, 0.5),
  c(4.474008e-06, 5.454518e-06, 0.6),
  c(7.727593e-06, 5.699172e-06, 0.7),
  c(1.679446e-06, 8.038964e-06, 0.8),
  c(2.969207e-06, 1.764419e-06, 0.9),
  c(8.288681e-06, 2.674241e-06, 1.0)
)

#plotting

dim(z) <- c(11,3)
z2 <- z + 1
z3 <- z - 1

p <- plot_ly(showscale = FALSE) %>%
  add_surface(z = ~z) %>%
  add_surface(z = ~z2, opacity = 0.98) %>%
  add_surface(z = ~z3, opacity = 0.98)
p
Wird der Code ausgeführt, zeigt R die Grafik an, diese sieht aber ein bisschenschräg aus, was evtl. auch an den
Testdaten liegen könnte.

Zum Abschluss: Mein Ziel ist es Bohrlochdaten (2-4 Bohrungen) in der Tiefe 3 dimensional darzustellen. Ist die
Herangehensweise meinerseits mit Plotly dafür geeignet oder liegt hier ein grundsätzliches Missverständnis vor?

Vielen Dank für Eure Hilfe und die Zeit, welche Ihr auch dafür nehmt.

PS: Trotz mehrfacher Wiederholung gelang es mir nicht den Code mit dem zugehörigen Button einzufügen. Was vorher kein Problem war.
Zuletzt geändert von jogo am Di Okt 09, 2018 10:25 am, insgesamt 1-mal geändert.
Grund: wieder mal die Formattierung von Code
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: 3D mit Plotly

Beitrag von jogo »

Hallo retep,

bitte formatiere Deine zukünftigen Nachrichten passend. Bitte lies viewtopic.php?f=20&t=29 :!:
Und was soll die Konstruktion c(c(...), c(...), ...) bewirken :?: Schau mal:

Code: Alles auswählen

c(c(1, 2, 3), c(4, 5, 6))
Möchtest Du eine Matrix konstruieren :?: Dafür gibt es die Funktion matrix() :idea:

Gruß, Jörg
retep
Beiträge: 99
Registriert: Do Sep 06, 2018 7:50 pm

Re: 3D mit Plotly

Beitrag von retep »

Hallo Jörg,

vielen Dank für deine Antwort! Ich habe mehrmals vergeblich versucht meine Codes zu formatieren. Was zuvor ohne Probleme möglich war hat bei dieser Frage nicht geklappt. Warum weiß ich nicht.

Zu deinem berechtigten Hinweis mit dem Erstellen einer Matrix. Hier nochmal der Link zu Plotly - Multiple Surface Plots (https://plot.ly/r/3d-surface-plots/). Dort ist genau das Beispiel angeführt, welches ich nachbauen wollte. Merkwürdigerweise wird der Code ausgeführt. Mit exakt dieser Formatierung. Das gleiche gilt für den Nachbau mit meinen Testdaten. Auch hier funktioniert der Code mit dieser Formatierung. Nur das ich denke, das der Plot ein bisschen merkwürdig aussieht, was evtl. auch an den Testdaten liegen könnte. Wenn man die Achsen bei dem Plot auf der Webseite sich genauer anschaut, wird eine Matrix von 15 Zeilen und 6 Spalten aufgebaut. Bei meinen Daten ist die Matrix mit 11x3 Zeilen und Spalten aufgebaut. Was exakt einem x-y-z Koordinatensystem entsprechen sollte. Das ist es was mich verwirrt! Ist vielleicht die Matrix im Original verdoppelt worden um eine höhere Dichte in der Darstellung zu generieren?

Nochmals vielen Dank für die Zeit, welche Ihr Euch nehmt.

Viele Grüße,

retep
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: 3D mit Plotly

Beitrag von jogo »

Hallo retep,

bei mir funktioniert schon das erste Beispiel von der Seite nicht:

Code: Alles auswählen

> library(plotly)
> p <- plot_ly(z = ~volcano) %>% add_surface()
> chart_link = api_create(p, filename="surface-1")
Fehler: Client error: (401) Unauthorized
	No such user
Zusätzlich: Es gab 12 Warnungen (Anzeige mit warnings())
> chart_link
Fehler: Objekt 'chart_link' nicht gefunden
Gruß, Jörg
retep
Beiträge: 99
Registriert: Do Sep 06, 2018 7:50 pm

Re: 3D mit Plotly

Beitrag von retep »

Hallo Jörg,

der korrekte Code lautet:

Code: Alles auswählen

p <- plot_ly(z = ~volcano) %>% add_surface()
p
du musst noch das "p" hinter her setzen. Dann wird der Code ohne Probleme ausgeführt. Das sollte auch für alle anderen Beispiel Codes auf dieser Webseite gelten.

Und nochmals Danke, dass du mir hilfst! Hoffentlich bekommen wir es zusammen hin, dass meine Daten plausibel mit dieser Darstellung geplottet werden können. Diese Art von Grafik ist fast das Wichtigste an meinem Mini-Projekt!

Viele Grüße,

retep
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: 3D mit Plotly

Beitrag von jogo »

Hallo retep,

so, jetzt läufts:

Code: Alles auswählen

library(plotly)
p <- plot_ly(z = ~volcano) %>% add_surface()
p
Der Rest ist wohl irgendein Server-Client-Gedöns.
Wenn nun also dieser Code läuft und Dein eigener nicht, sollte man zuerst das Objekt volcano näher untersuchen, also

Code: Alles auswählen

str(volcano)
... damit man anschließend die eigenen Daten genauso strukturiert.
Nicht schaden kann auch der Aufruf des Hilfetextes zu volcano

Gruß, Jörg
retep
Beiträge: 99
Registriert: Do Sep 06, 2018 7:50 pm

Re: 3D mit Plotly

Beitrag von retep »

Hallo Jörg,

entschuldige, natürlich hast du Recht! Auf die Idee hätte ich selbst kommen müssen!!!!! Die str(volcano) Abfrage ergibt als Ergebnis:
num [1:87, 1:61] 100 101 102 103 104 105 105 106 107 108 ...

Ein bisschen überraschend finde ich. Denn hier sehe ich keine x/y/z Struktur????? Ich habe mal im Anhang den Plot (Multiple Surface) mit meinen eigenen Daten angefügt.

Hier habe ich nochmal die kompletten Codes inkl. Mini Daten beigefügt:

Code: Alles auswählen

#####################################################################################
#Basic 3D Surface Plot
#####################################################################################
set.seed(0.0000001)
x <-runif(301, min=10^(-6), max=10^(-5))
y <-runif(301, min=10^(-6), max=10^(-5))
z <- seq(0,30,0.1)
data_xyz <- data.frame(x,y,z);data_xyz

p <- plot_ly(x = data_xyz$x, y = data_xyz$y, z = data_xyz$z) %>% add_surface()
p
#################################################################
#Multiple Surface
#################################################################
# der erste 1 m
z <-c(
  c(8.753440e-06, 3.087675e-06, 0.0),
  c(2.354936e-06, 4.172422e-06, 0.1),
  c(4.809585e-06, 8.902687e-06, 0.2),
  c(7.300328e-06, 1.498156e-06, 0.3),
  c(2.918452e-06, 1.915362e-06, 0.4),
  c(5.005054e-06, 2.203559e-06, 0.5),
  c(4.474008e-06, 5.454518e-06, 0.6),
  c(7.727593e-06, 5.699172e-06, 0.7),
  c(1.679446e-06, 8.038964e-06, 0.8),
  c(2.969207e-06, 1.764419e-06, 0.9),
  c(8.288681e-06, 2.674241e-06, 1.0)
)

#plotting

dim(z) <- c(11,3)
z2 <- z + 1
z3 <- z - 1

p <- plot_ly(showscale = FALSE) %>%
  add_surface(z = ~z) %>%
  add_surface(z = ~z2, opacity = 0.98) %>%
  add_surface(z = ~z3, opacity = 0.98)
p
################################################################################
#Basic
###############################################################################
p <- plot_ly(z = ~ z, type = "contour")
p
###################################################################################
Für das Beispiel Multiple Surface habe ich die Grafik im Anhang angefügt. Auch ist wie du schon bemerkt hast die Matrix-Zuweisung komisch.

Beim Beispiel "Basic 3D Surface Plot" bekomme ich die Fehlermeldung: Error: `z` must be a numeric matrix.

Im Beispiel "Basic Plot" ist mir ebenfalls nicht klar welche Werte auf der x/y-Achse geplottet werden. Zumindest habe ich meine eigenen Testdaten aus Beispiel Multiple Surface hier verwendet.

Nochmals vielen Dank für die Zeit, welche du dir nimmst!

Viele Grüße,

retep
Dateianhänge
Multiple Surface_own_test.png
Multiple Surface_own_test.png (38.83 KiB) 2195 mal betrachtet
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: 3D mit Plotly

Beitrag von jogo »

Hallo retep,
retep hat geschrieben: Do Okt 11, 2018 5:34 pm entschuldige, natürlich hast du Recht! Auf die Idee hätte ich selbst kommen müssen!!!!! Die str(volcano) Abfrage ergibt als Ergebnis:
num [1:87, 1:61] 100 101 102 103 104 105 105 106 107 108 ...

Ein bisschen überraschend finde ich. Denn hier sehe ich keine x/y/z Struktur?????
Mich überrascht, dass Du diese neue Information nicht entsprechend verarbeitest und bei Deinen Versuchen den gleichen Fehler wieder machst.
Es kann natürlich sein, dass es bei plot_ly() noch andere Aufrufkonventionen gibt, bei denen z.B. eine Struktur in der Form einer Tabelle von Datenpunkten verarbeitet wird. Du musst Dich in die entsprechenden Dokumentationen einarbeiten. Ich musste mich durch Deine Frage erstmalig mit plot_ly() beschäftigen und ich werde mich nicht an Deiner statt darin einarbeiten - das musst Du schon selber tun.

Hier ist ein Beispiel von mir:

Code: Alles auswählen

#####################################################################################
#Basic 3D Surface Plot
#####################################################################################

library(plotly)

x <-1:10
y <-1:10
myfun <- function(x, y) 200 - x^2 - y^2

p <- plot_ly() %>% add_surface(z=outer(x, y, FUN=myfun))
p
Hier habe ich nochmal die kompletten Codes inkl. Mini Daten beigefügt:
Diese Aussage stimmt so nicht - es fehlt die Angabe des verwendeten Paketes. :?

Beim Beispiel "Basic 3D Surface Plot" bekomme ich die Fehlermeldung: Error: `z` must be a numeric matrix.
Es ist immer geboten, den Fehlermeldungen zu glauben. Manchmal sind sie etwas kryptisch (z.B. weil bei falsch gesetzten Parametern R erst bei der Verarbeitung derselben erkennen kann, dass etwas nicht funktioniert), aber in diesem Fall ist die Aussage klar.

Code: Alles auswählen

library("fortunes")
fortune(85)
Vielleicht ist https://help.plot.ly/tutorials/ hilfreich. ( http://lmgtfy.com/?q=plotly+tutorial )

Gruß, Jörg
retep
Beiträge: 99
Registriert: Do Sep 06, 2018 7:50 pm

Re: 3D mit Plotly

Beitrag von retep »

Hallo Jörg,

hab vielen Dank für deine Hilfe! Und nein-ich hatte nicht angenommen, dass du mir die Arbeit abnimmst. Ich komme inzwischen etwas besser mit den Fehlermeldungen klar. Trotzdem habe ich immer noch große Schwierigkeiten diese Meldungen zu kategorisieren.

Nochmals, Danke.....

Gruß

retep
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: 3D mit Plotly

Beitrag von jogo »

Hallo retep,

o.k., hier noch eine Erkenntnis, die ich aus meinem kleinen selbstgestrickten Beispiel gewonnen habe:
Ähnlich wie ggplot() hat auch plotly() eine grundlegend andere Funktionsweise als die klassischen R-Grafikfunktionen.

Z.B. steht dort nur plot_ly() %>% ...
Damit bewirkt der Aufruf plot_ly() nur die Bereitstellung der Infrastruktur für die folgenden Operationen. Wie man den Hilfetexten entnehmen kann ist z= kein Parameter von plot_ly(), sondern von add_surface()
Wenn z= trotzdem in plot_ly() angegeben wird, erfolgt das Durchreichen an add_surface() über den Parameter ...
- das ist eine kraftvolle aber auch sehr trickreiche Methode, die Anfängern oft Probleme bereitet.
Da hilft eigentlich nur üben, üben und nochmals üben.

Gruß, Jörg
Antworten