Построение столбцов в кадре данных с использованием plotly () независимо от количества столбцов - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть фрейм данных с именем plt.total, состоящий из 5 строк (obs) и 7 столбцов (переменных), как показано ниже:

set.seed(2018)
plt.total <- data.frame(replicate(7,runif(5, min=0.80, max=0.9)))
colnames(plt.total) <- c("R", paste0("Matrix",1:6))
plt.total[,1] <- c(1:5)

Затем я строю его, используя plotly, как показано ниже:

plot_ly(data=plt.total, x = ~R, y = ~Matrix1, name = 'Matrix 1', type = 'scatter', mode = 'lines',
                  line = list(color = 'rgb(205, 12, 24)', width = 3, dash = 'dashdot')) %>%
        add_trace(y = ~Matrix2, name = 'Matrix 2', line = list(color = 'rgb(22, 96, 167)', width = 3, dash = 'solid' )) %>%
        add_trace(y = ~Matrix3, name = 'Matrix 3', line = list(color = 'rgb(205, 12, 24)', width = 3, dash = 'longdashdot')) %>%
        add_trace(y = ~Matrix4, name = 'Matrix 4', line = list(color = 'rgb(22, 96, 167)', width = 3, dash = 'dash')) %>%
        add_trace(y = ~Matrix5, name = 'Matrix 5', line = list(color = 'rgb(205, 12, 24)', width = 3, dash = 'dot')) %>%
        add_trace(y = ~Matrix6, name = 'Matrix 6', line = list(color = 'rgb(22, 96, 167)', width = 3, dash = 'dot')) %>%
layout(title = "", legend = list(x=0, y=0, font = list(family = "Times", size = 14, color = "#000")))

enter image description here

Однако моя проблема заключается в том, что время от времени plt.total изменяется на количество «столбцов», и я пытаюсь найтиспособ избежать модификации моих скриптов каждый раз (используя add_trace).Таким образом, моя цель состоит в том, чтобы построить входные данные для каждого столбца кадра данных, используя plotly независимо от количества столбцов.

Спасибо

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Мне удалось сделать это, используя список вместо фрейма данных, как показано ниже. Может, кто-нибудь знает даже лучший способ?

set.seed(2018)
plt.total <- list()
n <- 10 # number of lines in the plot
for (i in 1:n) {
    plt.total[i] <- list(
    list(x=c(1:5), y=replicate(1,runif(5, min=0.80, max=0.9)), color=randomcoloR::randomColor(n, luminosity="light")))
}

p <- plot_ly()
p
for(i in 1:length(plt.total)) {  p <- add_trace(p, y=plt.total[[i]]$y, 
                                                   x=plt.total[[i]]$x, line=list(color=plt.total[[i]]$color), 
                                                   name=paste0("Matrix",i), mode = "lines")%>%
                                          layout(title = "", legend = list(x=0, y=0, 
                                                   font = list(family = "Times", 
                                                   size = 14, color = "#000")),
                                          xaxis = list(title = "R Value", showline = TRUE, 
                                                   annotations= x, range=c(1, 5), linewidth = 2, mirror = "ticks",
                                                   titlefont = list(family = "Times", size = 18, color = "#000"), 
                                                   tickfont = list(family = "Times", size = 14, color = "#000")),
                                          yaxis = list (title = "Value", showline = TRUE, 
                                                   linewidth = 2,mirror = "ticks", 
                                                   titlefont = list(family = "Times", size = 18, color = "#000"), 
                                                   tickfont = list(family = "Times", size = 14, color = "#000")) )
}
p

enter image description here

0 голосов
/ 11 сентября 2018

Один из подходов состоит в том, чтобы преобразовать таблицу plt.total в длинный, «аккуратный» формат, чтобы можно было сопоставить номер матрицы вместо ручного добавления отдельных серий.

Здесь мы меняем формудлинных данных с новым полем «матрица», обозначающим, к какой серии относится наблюдение.

plt.total.tidy <-
  plt.total %>%
  tidyr::gather(matrix, value, -R)

Мой plotly-fu еще не очень хорош, поэтому я делаю диаграмму в ggplotсначала, а затем перенесите это на график, используя plotly::ggplotly, добавив выбранный вами макет.Если вы хотите указать цвета и типы линий вручную, вместо того чтобы назначать их вам, вы можете использовать для этого функции scale_color_manual и scale_linetype_manual.

library(ggplot2)
p <- ggplot(plt.total.tidy, aes(R, value, color = matrix, lty = matrix)) +
  geom_line(size = 1.1) +
  theme(legend.position = c(0.1,0.1)) #+   
  # Could add below lines if you want to manually pick colors and linetypes
  # scale_color_manual(....) +
  # scale_linetype_manual(....) +

ggplotly(p) %>%
  layout(title = "", legend = list(x=0, y=0, font = list(family = "Times", size = 14, color = "#000")))

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...