在情节上相当于abline

时间:2017-02-01 13:15:43

标签: r plot plotly

我想在plotly图表

中添加一行(不只是垂直或水平)
library(plotly)
d = data.frame(x=1:10, y=1:10)
plot_ly(d, x = ~x, y = ~y, type='scatter')

说我希望(D) y = 2x作为一条线,我可以在d

的另一列中自行绘制而不自行生成数据

2 个答案:

答案 0 :(得分:4)

至少有两种模拟abline的方法。

  • 添加包含起点和终点的其他跟踪
  • 使用起点和终点为line添加layout形状

缺点是每个跟踪的minmax需要计算(Plotly无论如何都需要这样做,但它会使代码膨胀。)

替代方案是将线从一个极端绘制到另一个极端,然后手动设置xaxisyaxis range

在下面的示例中,红线是添加的曲线,黑线是通过shape line添加的。

enter image description here

library('plotly')

#a function to calculate your abline
p_abline <- function(x, a=2, b=-5){
  y <- a * x + b
  return(y)
}

#create an empty plot    
p <- plot_ly()

#list with all your x and y values
x <-  list(c(1,2,3), c(2,3,6), (1:5))
y <-  list(c(1,2,3), c(0,5,10), sample(-10:10, 5))

#loop through the x/y values and determine min/max
for (i in 1:length(x)) {
  p<-add_trace(p, y=y[[i]], x=x[[i]] , type="scatter", mode="markers+lines")
  if (i == 1 || max(x[[i]]) > max_x) {
    max_x = max(x[[i]])
  }
  if (i == 1 || max(y[[i]]) > max_y) {
    max_y = max(y[[i]])
  }
  if (i == 1 || min(x[[i]]) < min_x) {
    min_x = min(x[[i]])
  }
  if (i == 1 || min(y[[i]]) < min_y) {
    min_y = min(y[[i]])
  }

}

#add a trace to simulate abline
p<-add_trace(p, x=c(min_x, max_x), y=c(p_abline(min_x), p_abline(max_x)) , type="scatter", mode="lines", name='abline')

#add a shape (line) to simulate abline
p <- p %>% layout(
  shapes=list(type='line', x0=min_x, x1=max_x, y0=p_abline(min_x, -1, 3), y1=p_abline(max_x, -1, 3))
  )

p

答案 1 :(得分:0)

library(plotly)
d = data.frame(x=1:10, y=1:10)
plot_ly(d, x = ~x, y = ~y, type='scatter') %>%
  add_trace(d, x = ~x, y = ~x * 2, type = "scatter")

事实证明,您可以在要说y的add_trace函数调用中直接进行数学运算。这样一来,您就可以说要在参数中将该列乘以2。