如何使用R在曲线上创建子图,其中每个子图是两条迹线

时间:2016-08-29 02:29:43

标签: r for-loop plotly

这是一个我坚持使用的玩具示例

library(plotly)
library(dplyr)

# construct data.frame
df <- tibble(x=c(3,2,3,5,5,5,2),y=c("a","a","a","b","b","b","b"))

# construct data.frame of last y values
  latest <- df %>% 
   group_by(y) %>% 
   slice(n())

# plot for one value of y (NB not sure why value for 3 appears?)
  p <- plot_ly() %>% 
   add_histogram(data=subset(df,y=="b"),x= ~x) %>%   
  add_histogram(data=subset(latest,y=="b"),x= ~x,marker=list(color="red")) %>%
  layout(barmode="overlay",showlegend=FALSE,title= ~y)
  p

enter image description here

我如何将它们设置为子图,每个y的唯一值一个?在现实世界的例子中,我将有20个不同的y,因此理想情况下循环或应用代码。另外,设置标准x刻度c(1:10)并且例如有2行

会很好

TIA

1 个答案:

答案 0 :(得分:1)

  1. 构建包含每个图的列表
  2. 为直方图手动设置箱尺寸,否则自动选择将为图中的每条轨迹选择不同的箱(使其看起来很奇怪,如示例中每条轨迹的条不同宽度)
  3. 使用子图将所有内容放在一起
  4. 使用注释列表为各个子图添加标题,如here
  5. 所述

    像这样:

    N = nlevels(factor(df$y))
    plot_list = vector("list", N)
    lab_list = vector("list", N)
    
    for (i in 1:N) {
      this_y = levels(factor(df$y))[i]
      p <- plot_ly() %>% 
        add_trace(type="histogram", data=subset(df,y==this_y), x=x, marker=list(color="blue"),
                  autobinx=F, xbins=list(start=0.5, end=6.5, size=1)) %>%   
        add_trace(type="histogram", data=subset(latest,y==this_y), x = x, marker=list(color="red"), 
                  autobinx=F, xbins=list(start=0.5, end=6.5, size=1)) %>%
        layout(barmode="overlay", showlegend=FALSE)
      plot_list[[i]] = p
    
      titlex = 0.5
      titley = c(1.05, 0.45)[i]
      lab_list[[i]] = list(x=titlex, y=titley, text=this_y, 
                           showarrow=F, xref='paper', yref='paper', font=list(size=18))
    }
    
    subplot(plot_list, nrows = 2) %>%
      layout(annotations = lab_list)
    

    enter image description here