2017-09-11 1 views
3

Mit plotly möchte ich jede Oberfläche eine andere Farbe haben.plotly - verschiedene Farben für verschiedene Oberflächen

library(plotly) 
t1 <- seq(-3, 3, 0.1); t2 <- seq(-3, 3, 0.1) 

p1 <- matrix(nrow = length(t1), ncol = length(t2)) 
p2 <- matrix(nrow = length(t1), ncol = length(t2)) 

p8a1 <- 1.2 
p8a2 <- 1 
p8d <- -1 
p8b1 <- 0.7 
p8b2 <- 0.6 

for (i in 1:length(t2)) { 
    for (j in 1:length(t1)) { 
     p1[i, j] <- 1/(1 + exp(-1.7 * (p8a1 * t1[j] + p8a2 * t2[i] + p8d))) 
     p2[i, j] <- (1/(1 + exp(-1.7 * p8a1 * (t1[j]- p8b1)))) * 
        (1/(1 + exp(-1.7 * p8a2 * (t2[j]- p8b2)))) 
    } 
} 

df1 <- list(t1, t2, p1) 
df2 <- list(t1, t2, p2) 

names(df1) <- c("t1", "t2", "p1") 
names(df2) <- c("t1", "t2", "p2") 
m <- list(l = 10, r = 10, b = 5, t = 0, pad = 3) 

p <- plot_ly(color = c("red", "blue")) %>% 
    add_surface(x = df1$t1, 
       y = df1$t2, 
       z = df1$p1, 
       opacity = 0.8) %>% 
    add_surface(x = df2$t1, 
       y = df2$t2, 
       z = df2$p2, 
       opacity = 1) %>% 
    layout(autosize = F, width = 550, height = 550, margin = m, 
      scene = list(xaxis = list(title = "Theta 1"), 
         yaxis = list(title = "Theta 2"), 
         zaxis = list(title = "P")), 
      dragmode = "turntable") 
p 

Leider kann ich die Farben dieser beiden Oberflächen nicht ändern. Ich habe versucht, color = I("red") und color = I("blue") Argumente in add_surface hinzuzufügen, aber dies nur Farbskala von rot nach blau für beide Oberflächen geändert.

Ich habe auch versucht color = "red" in plot_ly() hinzuzufügen und inherit = F in der zweiten add_surface hinzuzufügen. Dies änderte nur die erste Oberfläche, aber nur die gelbe Standardfarbe in rot. Ich hätte gerne eine Oberfläche rot und eine zweite blau.

Antwort

2

Klingt trivial, aber es ist ein bisschen schwierig in Plotly. Die Farbe eines Oberflächendiagramms wird entweder von den z-Werten oder von einem Array mit denselben Abmessungen wie z abgeleitet. Dieses Farbfeld akzeptiert nur numerische Werte, keine Farbzeichenfolgen oder RGB-Werte.

Also lassen Sie uns ein Array für unsere Farben definieren

color <- rep(0, length(df1$p1)) 
dim(color) <- dim(df1$p1) 

Als nächstes müssen wir Plotly in ignorieren die Farbkarte betrügen.

surfacecolor=color, 
      cauto=F, 
      cmax=1, 
      cmin=0 

und voilà, wir haben eine uniforme farbige Handlung.

enter image description here


library(plotly) 
t1 <- seq(-3, 3, 0.1); t2 <- seq(-3, 3, 0.1) 

p1 <- matrix(nrow = length(t1), ncol = length(t2)) 
p2 <- matrix(nrow = length(t1), ncol = length(t2)) 

p8a1 <- 1.2 
p8a2 <- 1 
p8d <- -1 
p8b1 <- 0.7 
p8b2 <- 0.6 

for (i in 1:length(t2)) { 
    for (j in 1:length(t1)) { 
    p1[i, j] <- 1/(1 + exp(-1.7 * (p8a1 * t1[j] + p8a2 * t2[i] + p8d))) 
    p2[i, j] <- (1/(1 + exp(-1.7 * p8a1 * (t1[j]- p8b1)))) * 
     (1/(1 + exp(-1.7 * p8a2 * (t2[j]- p8b2)))) 
    } 
} 

df1 <- list(t1, t2, p1) 
df2 <- list(t1, t2, p2) 

names(df1) <- c("t1", "t2", "p1") 
names(df2) <- c("t1", "t2", "p2") 
m <- list(l = 10, r = 10, b = 5, t = 0, pad = 3) 

color <- rep(0, length(df1$p1)) 
dim(color) <- dim(df1$p1) 
p <- plot_ly(colors = c('red', 'blue')) %>% 
    add_surface(x = df1$t1, 
       y = df1$t2, 
       z = df1$p1, 
       opacity = 0.8, 
       #surfacecolor=c('red') 
       surfacecolor=color, 
       cauto=F, 
       cmax=1, 
       cmin=0 
) 
color2 <- rep(1, length(df2$p2)) 
dim(color2) <- dim(df2$p2) 

p <- add_surface(p, 
       x = df2$t1, 
       y = df2$t2, 
       z = df2$p2, 
       opacity = 1, 
       surfacecolor=color2, 
       cauto=F, 
       cmax=1, 
       cmin=0) 
p 
+0

Nun, das war ein bisschen schwierig! Vielen Dank, es funktioniert perfekt! – Adela

Verwandte Themen