Добавить сюжетную фигуру в качестве вставки к другой сюжетной фигуре

Я думаю, что это сюжетная ситуация, которая обычно возникает в науке о данных.

У меня есть некоторые данные, по которым я провожу статистический тест, и я хочу нанести данные вместе с результатами статистического теста на один график.

Вот пример:

Данные представляют собой два распределения (из двух групп):

library(dplyr)
set.seed(1)

data.df <- data.frame(val = c(rnorm(100,0,1),rnorm(100,1,1)),
                 group = c(rep("A",100),rep("B",100)))

Я строю эти данные на графике плотности:

density.df <- do.call(rbind,lapply(levels(data.df$group),function(g){
  dens <- density(dplyr::filter(data.df,group == g)$val)
  data.frame(x = dens$x, y = dens$y, group = g)
}))

library(plotly)

density.plot <- plot_ly(x = density.df$x, y = density.df$y, type = 'scatter', mode = 'lines',color = density.df$group) %>%
  layout(xaxis = list(title= "Value", zeroline = F), yaxis = list(title = "Density", zeroline = F))

Который дает:

И давайте предположим, что я установил для них некоторую статистическую модель с двумя интересующими факторами и получил эти результаты:

effects.df <- data.frame(effect = c(0.5, 0.75), effect.error = c(0.05,0.1), factor = c("Factor-A","Factor-B"))

Я представляю эти данные на графике гусеницы:

effects.plot <- plot_ly(type = 'scatter', mode = "markers", marker = list(size = 13, color = "black"),
                        x = effects.df$effect, y = effects.df$factor, showlegend = F) %>%
  layout(xaxis = list(range=c(-1,1), title = "Effect Size", zeroline = T, showticklabels = T, font = list(size=15)),
         yaxis = list(title = NA, zeroline = F, showticklabels = T, tickvals = effects.df$factor, ticktext = as.character(effects.df$factor)), font = list(size = 15)) %>%
  add_trace(error_x = list(array = effects.df$effect.error, width = 5, color = "black"), showlegend = F)

Который дает:

Теперь я хотел бы добавить effects.plot в качестве вставки в верхнем правом квадранте density.plot, Я специально добавляю это как вставку, а не группирую их, используя plotly "s subplot функция.

Итак, мой вопрос: как мне это сделать?

plotly действительно есть пример добавления вставок, но мои попытки вписать мой случай в это не увенчались успехом.

Любая идея?

1 ответ

Решение

Вам нужно определить новую пару осей (xaxis2 а также yaxis2) с помощью layout а затем отнести второй график к этой системе координат.

library(dplyr)
library(plotly)
set.seed(1)
data.df <- data.frame(val = c(rnorm(100,0,1),rnorm(100,1,1)),
                 group = c(rep("A",100),rep("B",100)))

density.df <- do.call(rbind, lapply(levels(data.df$group),
     function(g) {
      dens <- density(dplyr::filter(data.df,group == g)$val)
      data.frame(x = dens$x, y = dens$y, group = g)
     }) )

effects.df <- data.frame(effect = c(0.5, 0.75), 
                         effect.error = c(0.05,0.1), 
                         factor = c("Factor-A","Factor-B"))

density.plot <- density.df %>%
plot_ly(x = ~x, y = ~y, color = ~group,
            type = 'scatter', mode = 'lines') %>%
add_markers(x = ~effect, y = ~factor, showlegend = F, 
            error_x=list(array=~effect.error, width=5, color="black"),
            marker = list(size = 13, color = "black"), 
            xaxis = 'x2', yaxis = 'y2', data=effects.df, inherit=F) %>%
layout(xaxis = list(title= "Value", zeroline = F), 
       yaxis = list(title = "Density", zeroline = F),
       xaxis2 = list(domain = c(0.7, 0.95), anchor='y2', range=c(-1,1), title = "Effect Size", 
                     zeroline = T, showticklabels = T, font = list(size=15)),
       yaxis2 = list(domain = c(0.5, 0.95), anchor='x2', title = NA, zeroline = F, 
                     showticklabels = T, tickvals = effects.df$factor, 
                     ticktext = as.character(effects.df$factor)))

ht tps://stackru.com/images/a401b29fcf04d00e48b55aada69226fc5a8934f0.png

Другие вопросы по тегам