你如何使绘图误差线遵循色标?
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'))
生成:
我必须安装 ggplot2
和 plotly
的最新开发版本才能使其正常工作(不确定是哪一个成功了,我只是从源代码安装了这两个)。但之后的解决方案似乎非常简单。
#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
参数。 color
和 name
都必须包括在内。我们必须手动定义 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))
首先让我说我已经尝试了
我想制作一个简单的两个变量的散点图,每个变量都有误差线。我希望点的颜色及其误差条遵循由第三个变量确定的比例。我无法使错误栏颜色与标记匹配。以下是我尝试过的几个简单方法及其结果。
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'))
生成:
我必须安装 ggplot2
和 plotly
的最新开发版本才能使其正常工作(不确定是哪一个成功了,我只是从源代码安装了这两个)。但之后的解决方案似乎非常简单。
#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
参数。 color
和 name
都必须包括在内。我们必须手动定义 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))