Как заставить графически отображать полосы ошибок в соответствии с цветовой шкалой? - PullRequest
5 голосов
/ 30 октября 2019

Позвольте мне начать с того, что я попробовал методы, описанные в Строки ошибок цветового кодирования на графике точечного разброса , но я не смог заставить их работать. Из того, что я могу сказать, произошли изменения в том, как обрабатываются колораксы в сюжетной версии 4. Возможно, именно поэтому это больше не решает проблему.

Я хочу создать простую диаграмму рассеяния из двух переменных с барами ошибок для каждогопеременная. Мне бы хотелось, чтобы цвет точек и их полосок ошибок соответствовал шкале, определяемой третьей переменной. Мне не удалось сделать цвета панели ошибок соответствующими маркерам. Ниже приведены несколько простых методов, которые я попробовал, и их результаты.

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'))

enter image description here

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'))

Bad color bars

Ответы [ 3 ]

7 голосов
/ 11 ноября 2019

В документации по r plotly может быть немного не хватает. Я думаю, что это то, что вы ищете, хотя. Вы хотите использовать аргумент name. Обе color и name должны быть включены. Мы должны определить уровни аргумента name вручную. Мы также можем установить коэффициент color, но тогда мы потеряем цветовую шкалу. 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))

enter image description here

2 голосов
/ 11 ноября 2019

Мне пришлось установить последние dev-версии 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)

enter image description here

1 голос
/ 08 ноября 2019

Это довольно ужасное решение, но оно может породить некоторые идеи. В основном это включает в себя создание вектора с цветами, которые будут иметь каждая точка / панель ошибок, и добавление каждой точки к графику отдельно.

# 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'))

, который генерирует: enter image description here

...