R - 如果满足条件,则在Plotly中添加跟踪

时间:2017-12-04 17:39:06

标签: r plotly

我正在创建一个散点图,如果满足条件,我想通过跟踪连接点。我的数据被分成序列,如果X和Y坐标是同一序列的一部分,我希望有一个跟踪。我的示例数据和代码段如下所示。

示例数据:

X   Y   Seq
1   3    1
2   5    1
1   4    1
3   1    2
4   5    2
6   3    3
3   4    3

在这个例子中,我想跟踪点(1,3),(2,5),(1,4)跟踪,跟踪点(3,1),(4,5)和点(6,3) ,(3,4)追溯。如果新序列开始,则跟踪应该有中断。

代码:

 plot_ly (data, x = data$X , y = data$Y,
          type = "scatter", 
          mode="markers")%>%
          add_trace(data$Seq==shift(data$Seq, type="lag"), mode="lines")

这是我的实际数据给出的情节图。您可以看到正在绘制点,但没有中断。Trace

1 个答案:

答案 0 :(得分:2)

问题在于您使用add_trace。当此参数需要现有的绘图/跟踪时,您将我假设的数据子集传递给add_trace的第一个参数。问题是,由于您使用%>%输入,因此该函数继承原始数据并忽略您的子集。

请注意,即使我的变量NO与情节无关,下面也会给出相同的情节:

X=c(1,2,1,3,4,6,3)
Y=c(3,5,4,1,5,3,4)
seq=c(1,1,1,2,2,3,3)
dataX <- data.frame(X,Y,seq)

NO <- "this won't work"
plot_ly plot_ly (dataX, x = dataX$X , y = dataX$Y,
         type = "scatter", 
         mode="markers") %>%
          add_trace(NO, mode="lines")

enter image description here

您可以使用inherit=F解决这个问题,但之后它不会起作用,因为add_trace正在尝试向情节NO添加一些不是情节的情节({1}}而你的子集也不会工作

plot_ly (dataX, x = dataX$X , y = dataX$Y,
         type = "scatter", 
         mode="markers") %>%
  add_trace(NO, mode="lines", inherit=FALSE)

## No trace type specified: 

当您添加要在x=y=中明确显示的跟踪时。然后,您可以允许它自动继承先前的绘图/跟踪,或指定一个。至于你想要做什么,你可以用循环来构建它:

#make the plot
p <- plot_ly (dataX, x = dataX$X , y = dataX$Y,
         type = "scatter", 
         mode="markers")

#build it up
for(i in levels(factor(dataX$seq))){
  #subset data
  dataFilt <- dataX[dataX$seq==i,]
  #add it
  p <- add_trace(p, x=dataFilt$X, y=dataFilt$Y,mode="lines",color ='yellow')
}
p

enter image description here

每次都会制作一个新系列,所以它有点像是一种解决方法。您可以隐藏图例,看起来是正确的:

p %>%
  layout(showlegend = FALSE)

enter image description here