Plotly: Как добавить срединную линию на прямоугольнике - PullRequest
2 голосов
/ 06 февраля 2020

Я хотел бы добавить след средней линии на моем поле.

вот так

enter image description here

Вот мои участки на данный момент:

enter image description here

library(plotly)
p <- plot_ly(y = ~rnorm(50), type = "box") %>%
  add_trace(y = ~rnorm(50, 1))

p

Ответы [ 2 ]

2 голосов
/ 07 февраля 2020

Просто начните с точечной диаграммы, используя plot_ly(..., type='scatter', mode='lines', ...), и следуйте одному add_boxplot(...' inherit=FALSE, ...) за коробочную диаграмму. Вот как это делается для всего data.frame:

enter image description here

Полный код с образцами данных:

library(dplyr)
library(plotly)

# data
df <- data.frame(iris) %>% select(-c('Species'))
medians <- apply(df,2,median)

# create common x-axis values for median line and boxplots
xVals <- seq(0, length(medians)-1, by=1)

# plotly median line setup
p <- plot_ly(x = xVals, y=medians, type='scatter', mode='lines', name='medians')

# add a trace per box plot
i <- 0
for(col in names(df)){
  p <- p %>% add_boxplot(y = df[[col]], inherit = FALSE, name = col)
  i <- i + 1
}

# manage layout
p <- p %>% layout(xaxis = list(range = c(min(xVals)-1, max(xVals)+1)))
p
1 голос
/ 07 февраля 2020

Другой вариант - использовать ggplot2 и преобразовать его в сюжет

library(ggplot2)
library(dplyr)
library(tidyr)
library(plotly)

p = iris %>% pivot_longer(-Species) %>%
 ggplot(aes(x=name,y=value,col=name)) + 
geom_boxplot() + stat_summary(inherit.aes = FALSE,
aes(x=name,y=value,group=1),fun.y=median,geom="line")
ggplotly(p)

Краткое описание кода. Я использую pivot_longer из tidyr для приведения кадра данных в длинный формат, и сначала сделал блокпост с именами столбцов в виде переменной x и цвета.

В части stat_summary я снова указал те же переменные x и y, и на этот раз пропустил цвет, добавив group=1, это говорит stat_summary, чтобы рассмотреть весь фрейм данных как одну группу, суммировать все значения y для каждой x-группы и провести через него линию.

enter image description here

...