在 plotly R 中设置颜色在添加标记中不起作用(因素)

Setting colours in plotly R is not working (factors) in add markers

我正在尝试使用自定义调色板在 R 中为“点”或标记设置颜色。它不起作用。我也在尝试为图表添加标题,但它不会出现。此外,我想删除图例的一些元素(如额外的“z”)并为图例元素添加标题。似乎没有任何效果,即使它存在于代码中。

library(plotly)
library(tidyverse)
set.seed(123456)
pal <- c("black", "orange", "darkgreen", "pink")
pal <- setNames(pal, levels(as.factor(c("gr1","gr2","gr3","gr4"))))

linedat = data.frame(x = rep(mean(1:50),2),
                         y = rep(mean(1:50),2),
                         z = c(0,1))

zoom = 3
pg = plotly::plot_ly(x = 1:50, 
                     y = 1:50, 
                     z = outer(1:50,1:50,"+")/100) %>% 
  add_surface(contours = list(
    z = list(show = TRUE, start = 0, end = 1, size = 0.05)), 
    opacity = 1) %>%  
  add_markers(x = rnorm(50,25,5),
              y = rnorm(50,25,5),
              marker = list(opacity = 0.9),
              type="scatter3d",
              mode = "markers",inherit = FALSE,
              colors = pal,
              color = as.factor(sample(1:4,50,replace = T)),
              z = rbinom(50,1,.5)) %>% 
  layout(scene=list(title = "Title won't show up????", 
                    xaxis = list(title = 'trait1'), 
                    yaxis = list(title = 'trait1',autorange = "reversed"), 
                    camera = list(eye = list(x = cos(0.8*pi)*zoom, y = sin(pi*1.3)*zoom, z= 2.00)),
                    legend = list(title=list(text='<b> Groups </b>')))) %>% 
  add_trace(data=linedat, x=~x, y=~y, z=~z,
            type="scatter3d", mode="lines", 
            line = list(color = pal[1], 
                        width = 14),name = "Avg. data1")%>% 
  add_trace(data=linedat, x=~x+20, y=~y+20, z=~z, 
            type="scatter3d", mode="lines", 
            line = list(color = pal[4], 
                        width = 14),name = "Avg. data2")
pg

看看我如何在这里设置点的颜色,但我无法获得要在图例中显示的颜色名称(我修改了代码以匹配@Kat 的建议) :

library(plotly)
library(tidyverse)
set.seed(123456)
pal <- c("black", "orange", "darkgreen", "pink")
pal <- setNames(pal, levels(as.factor(c("gr1","gr2","gr3","gr4"))))

linedat = data.frame(x = rep(mean(1:50),2),
                         y = rep(mean(1:50),2),
                         z = c(0,1))

zoom = 3
pg = plotly::plot_ly(x = 1:50, 
                     y = 1:50, 
                     z = outer(1:50,1:50,"+")/100) %>% 
  add_surface(contours = list(
    z = list(show = TRUE, start = 0, end = 1, size = 0.05)), 
    opacity = 1, colorbar = list(title = "Only one Z")) %>%  
  add_markers(x = rnorm(50,25,5),
              y = rnorm(50,25,5),
              marker = list(color = pal[as.factor(sample(1:4,50,replace = T))],opacity = 0.9),
              type="scatter3d",
              mode = "markers",inherit = FALSE,
              colors = pal,
              
              z = rbinom(50,1,.5)) %>% 
  layout(title = "Title that won't show",
         margin = list(t = 40),
         legend = list(title = list(
           text = "<br>Legends deserve names, too")),
         scene=list(xaxis = list(title = 'trait1'), 
                    yaxis = list(title = 'trait1',autorange = "reversed"), 
                    camera = list(eye = list(x = cos(0.8*pi)*zoom, 
                                             y = sin(pi*1.3)*zoom, z= 2.00)))) %>% 
  add_trace(data=linedat, x=~x, y=~y, z=~z,
            type="scatter3d", mode="lines", 
            line = list(color = pal[1], 
                        width = 14),name = "Avg. data1")%>% 
  add_trace(data=linedat, x=~x+20, y=~y+20, z=~z, 
            type="scatter3d", mode="lines", 
            line = list(color = pal[4], 
                        width = 14),name = "Avg. data2");pg

您原来的 plot_ly 通话和 add_trace 通话可以保持原样。我已经包含了 layout 调用所需的更改并添加了 colorbar.

所需的调用

布局优先

layout(title = "Title that won't show",       # <------ give my plot a name
         margin = list(t = 40),                 # don't smash that title, either
         legend = list(title = list(
           text = "<br>Legends deserve names, too")), # <--- name my legend
         scene=list(title = "Title won't show up????", # <- this can go away
                    xaxis = list(title = 'trait1'), 
                    yaxis = list(title = 'trait1',autorange = "reversed"), 
                    camera = list(eye = list(x = cos(0.8*pi)*zoom, 
                                             y = sin(pi*1.3)*zoom, z= 2.00)),
                    legend = list(title=list(text='<b> Groups </b>')))) %>% 
  colorbar(title = "Only one Z")          # <--- give me one z colorbar title

(图片中有些颜色不同;我没有意识到我有 pal object...叹息)



更新

这解决了您的其他问题。

首先,我在为颜色条设置标题的方法中没有收到错误。您必须分享您遇到的错误。

我也没有意识到它忽略了您在标记中设置的颜色。解决此问题的最简单方法是先调用该跟踪。由于在 markers 内没有声明任何其他内容,我在列表外调用了 opacity ,但你的方式很好。

首先,我注释掉了 setNames 调用,因为这对标记的轨迹不起作用,对其他轨迹也无关紧要。

library(plotly)

set.seed(123456)
pal <- c("black", "orange", "darkgreen", "pink")
# pal <- setNames(pal, levels(as.factor(c("gr1","gr2","gr3","gr4")))) 

linedat = data.frame(x = rep(mean(1:50),2),
                     y = rep(mean(1:50),2),
                     z = c(0,1))
zoom = 3

我将 plot_ly() 设为空,并将表面的所有数据放入该轨迹中。我还添加了 inherit = false 以便布局可以在最后没有数据错误。

set.seed(123456)
pg = plotly::plot_ly() %>% 
  add_trace(inherit = F,
            x = rnorm(50,25,5),
            y = rnorm(50,25,5),
            type="scatter3d",
            mode = "markers",
            opacity = .8,
            colors = pal,
            color = as.factor(sample(1:4, 50, replace = T)),
            z = rbinom(50,1,.5)) %>% 
  add_surface(x = 1:50, 
              y = 1:50, 
              z = outer(1:50,1:50,"+")/100,
              colorscale = "Viridis",
              contours = list(
                z = list(show = TRUE, start = 0, end = 1, size = 0.05)), 
              opacity = 1) %>%  
  add_trace(data=linedat, x=~x, y=~y, z=~z,
            type="scatter3d", mode="lines", 
            line = list(color = pal[1], 
                        width = 14),name = "Avg. data1", inherit = F) %>% 
  add_trace(data=linedat, x=~x+20, y=~y+20, z=~z, 
            type="scatter3d", mode="lines", 
            line = list(color = pal[4], 
                        width = 14),name = "Avg. data2", inherit = F) %>%

最后一部分是布局,但这与我原来的答案没有什么不同。

  layout(title = "Title that won't show",       # <------ give my plot a name!
         margin = list(t = 40),                 # don't smash that title, either
         legend = list(title = list(
           text = "<br>Legends deserve names, too"),
           tracegroupgap = 350), # <--- name my legend!
         scene=list(title = "Title won't show up????",   # <--- this can go away!
                    xaxis = list(title = 'trait1'), 
                    yaxis = list(title = 'trait1',autorange = "reversed"), 
                    camera = list(eye = list(x = cos(0.8*pi)*zoom, 
                                             y = sin(pi*1.3)*zoom, z= 2.00)),
                    legend = list(title=list(text='<b> Groups </b>')))) %>% 
  
  colorbar(title = "Only one Z")      # <--- give me one z for the title!
pg