你如何使绘图误差线遵循色标?

How do you make plotly error bars follow a colorscale?

首先让我说我已经尝试了 中概述的方法,但我无法让它们起作用。据我所知,在第 4 版 plotly 中处理 coloraxes 的方式发生了变化,这可能就是这不再解决问题的原因。

我想制作一个简单的两个变量的散点图,每个变量都有误差线。我希望点的颜色及其误差条遵循由第三个变量确定的比例。我无法使错误栏颜色与标记匹配。以下是我尝试过的几个简单方法及其结果。

set.seed(1)
x.data <- rnorm(20, 0, 1)
y.data <- rnorm(20, 2, 1)
x.err <- runif(20, 0.2, 0.8)
y.err <- runif(20, 0.2, 0.8)
z.data <- runif(20, 1.7, 2.8)

p <- plot_ly() %>%
  add_markers(x=x.data, y=y.data,
              error_x=list(array=x.err, color=z.data),
              error_y=list(array=y.err, color=z.data),
              marker=list(color=z.data, colorscale='Viridis',
                          colorbar=list(title='Z', limits=range(z.data)))) %>%
  layout(xaxis=list(title='X'), yaxis=list(title='Y'))

z.norm <- (z.data - min(z.data))/(max(z.data)-min(z.data))
mycramp<-colorRamp(c("darkblue","yellow"))
mycolors<-rgb(mycramp(z.norm), maxColorValue = 255)

p <- plot_ly() %>%
  add_markers(x=x.data, y=y.data,
              error_x=list(array=x.err, color=mycolors),
              error_y=list(array=y.err, color=mycolors),
              marker=list(color=mycolors,
                          colorbar=list(title='Z', limits=range(z.data)))) %>%
  layout(xaxis=list(title='X'), yaxis=list(title='Y'))

这是一个非常糟糕的解决方案,但它可能会产生一些想法。 基本上它涉及创建一个向量,其中包含每个 point/error-bar 将具有的颜色,并将每个点分别添加到绘图中。

# create the base plot
# if you uncomment the marker line it will also show the colourbar on the side
# but the formatting is messed up, haven't figured out yet how to solve that
p <- plot_ly(
  type='scatter',
  mode='markers'
  # , marker=list(colorscale='Viridis', colorbar=list(title='Z', limits=range(z.data)))
)

# create a vector of colours per point
z <- (z.data - min(z.data)) / (max(z.data) - min(z.data))
z <- viridis::viridis(1001)[round(z * 1e3) + 1]

# add each point separately
for (i in seq_along(x.err)){
  p <- p %>% add_markers(
    x=x.data[i],
    y=y.data[i], 
    error_x=list(array=x.err[i], color=z[i]),
    error_y=list(array=y.err[i], color=z[i]),
    marker=list(color=z[i]),
    showlegend=F
  )
}
p %>% layout(xaxis=list(title='X'), yaxis=list(title='Y'))

生成:

我必须安装 ggplot2plotly 的最新开发版本才能使其正常工作(不确定是哪一个成功了,我只是从源代码安装了这两个)。但之后的解决方案似乎非常简单。

#get the latest ggplot2 and plotly from github
# devtools::install_github("tidyverse/ggplot2")
# devtools::install_github("ropensci/plotly")

#first, create a static ggplot2 charts    
p1 <- 
  ggplot( df, aes( x = x.data, y = y.data, color = z.data ) ) +
  #plot points
  geom_point( ) +
  #plot horizontal errorbars
  geom_errorbarh( aes( xmin = x.data - x.err, xmax = x.data + x.err ), 
                  height = 0.1 ) +
  geom_errorbar( aes( ymin = y.data - y.err, ymax = y.data + y.err ), 
                 width = 0.1 ) +
  #set color scale
  scale_color_gradient2( low = "purple4", mid = "darkcyan", high = "yellow", 
                         midpoint = min(df$z.data) + ( max(df$z.data) - min(df$z.data) ) / 2 )

#and then plot the chart as plotly
ggplotly(p1)

r plotly 上的文档可能有点缺乏。我认为这就是您要找的东西。您想要使用 name 参数。 colorname 都必须包括在内。我们必须手动定义 name 参数的级别。我们也可以将 color 设置为 factor 但这样我们就失去了色带。 colors 让我们使用 RColorBrewer 个调色板更改调色板。

plot_ly() %>%
  add_markers(x = x.data, 
              y = y.data, 
              showlegend = F, # must hide legend here or it shows up twice
              name = factor(z.data, levels = z.data, labels = z.data), # this is missing
              color = z.data, 
              colors = "Set1", 
              error_x = list(array = x.err),
              error_y = list(array = y.err))