2017-09-11 198 views
3

使用plotly我希望每個表面具有不同的顏色。plotly - 不同表面的不同顏色

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 

不幸的是,我無法改變這兩個表面的顏色。我試圖將color = I("red")color = I("blue")參數添加到add_surface中,但這只是將顏色比例從兩側的紅色更改爲藍色。

我也嘗試將color = "red"加入plot_ly()並將inherit = F加入第二個add_surface。這隻改變了第一個表面,但只將黃色的默認顏色改爲紅色。我希望有一個表面紅色和第二個藍色。

回答

2

聲音微不足道,但在Plotly中有點棘手。曲面圖的顏色是從z值或與z具有相同尺寸的數組中導出的。此顏色數組只能接受數值,無顏色字符串或RGB值。

所以,讓我們定義一個數組爲我們的顏色

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

接下來,我們需要Plotly誘騙忽略colorscale。

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

等等,我們有一個uniformely彩色情節。

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

嗯,這是一個有點棘手!非常感謝,它非常完美! – Adela