每组/因子的Plotly R子面板

时间:2018-04-01 10:11:32

标签: r plot shiny plotly

我试图找到一个示例,如何创建一个绘图,其中为一列中的每个因子创建一个子面板,y轴是一个值列,而x例如是日期或rowname

例如,如果我们采用mtcars数据框,按cyl分组以创建每个圆柱值1个子面板,将mpg绘制为y轴,将rowname绘制为x轴

变量因子 此外,在我的预期情况下,我不知道会有多少独特因素,因为这取决于在绘图阶段之前在闪亮应用程序中创建数据的模型。

我看到了这个例子,但每个变量列绘制一个面板,而不是每个因子绘制一个面板:

p <- economics %>%
  tidyr::gather(variable, value, -date) %>%
  transform(id = as.integer(factor(variable))) %>%
  plot_ly(x = ~date, y = ~value, color = ~variable, colors = "Dark2",
          yaxis = ~paste0("y", id)) %>%
  add_lines() %>%
  subplot(nrows = 5, shareX = TRUE)

如果有人知道让我入门的方法或有关于如何做到这一点的现有例子,我将非常感激

修改 我尝试构建此代码,但似乎在每个面板中绘制所有值

   mydf <- mtcars[ ,names(mtcars)[which(names(mtcars) %in%  c('cyl', 'mpg', 'hp'))]]
plot_ly(data = mydf, x =~hp, y=~mpg, type = 'scatter')


myplotlysub <- function(dat) {
  plot_ly(data = mydf, x =~hp, y=~mpg, type = 'scatter', mode = 'markers')
}

p <- mydf %>%
  group_by(cyl) %>%
  do(plot = myplotlysub(.)) %>%
  subplot(nrows = 1) %>%
  layout(
    showlegend = TRUE)
p

panels but not correcte

1 个答案:

答案 0 :(得分:1)

使用ggplotly

执行此任务的一种可能方法是利用ggplot2的{​​{1}}&amp;然后使用facet_grid将ggplot对象转换为图形对象。 plotly::ggplotly函数并不总是很好,但如果您熟悉ggplotly,那么这是一个快速获取情节图的方法。注意,因为从ggplot2返回的对象是一个绘图对象,我们可以使用绘图函数进一步修改它。

ggplotly

enter image description here

使用library(ggplot2) library(plotly) # move rownames to a column for use in `aes()` my_mtcars = mtcars my_mtcars$model = rownames(my_mtcars) # create ggplot p = ggplot(my_mtcars, aes(x=model, y=mpg)) + geom_bar(stat='identity') + # facet by cyl (drop unused factors in a facet using free_x) facet_grid(. ~ cyl, scales = "free_x") + labs(x='') + # rotate and size x tick marks theme(axis.text.x = element_text(angle = 90, hjust = 1, size=5)) # add plotly-ness ggplotly(p) %>% layout(title="MPG by CYL")

您也可以使用此SO Q/A中指出的subplot。但是,答案使用plotly::subplot的公式语法,似乎与plotly使用purrr冲突,并导致错误。要运行w / o错误,您可以避免使用~图表语法或使用~var代替lapply

purrr::map + subplot相比,facet_grid的缺点是你最终得到了不同的缩放y轴;如果你想避免混淆,你必须手动解决这个问题。

ggplotly

enter image description here