2017-02-01 3 views
0

Я хотел бы добавить строку (не только по вертикали или по горизонтали) на plotly графикиЭквивалента abline в plotly

library(plotly) 
d = data.frame(x=1:10, y=1:10) 
plot_ly(d, x = ~x, y = ~y, type='scatter') 

Say Я хочу (D) y = 2x как линия есть способ для меня, чтобы построить без создания данные в другом столбце d

+0

Вы ищете что-то вроде 'plot_ly (д, х = ~ х, у = ~ у, тип = 'разброс', режим = "маркеры")%>% add_trace (х = ~ 2 * x, y = ~ y, mode = "lines") ' – Jota

+0

да, но что, если у меня есть несколько графиков, и я не знаю« xlim »самого« широкого »подзаголовка, я мог бы закончить с линией, которая не «покрывает» весь график – statquant

+0

Добавьте один из них? '%>% layout (xaxis = list (range = c (~ min (x), ~ max (x))))'? Мне может понадобиться другой пример, если это не проблема. – Jota

ответ

2

Существует не менее двух способов моделирования abline.

  • Добавить еще один след с начальной и конечной точкой
  • Добавить line форму в layout с начальной и конечной точкой

Недостаток заключается в том, что min и max для каждой трассы должен (Plotly должно это делать, но это раздувает код).

Альтернативой может быть линия от одной крайности к другой, а затем установить xaxis и yaxisrange вручную.

В приведенном ниже примере красная линия представляет собой добавленную трассировку, в то время как черная линия добавляется через shapeline.

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 
Смежные вопросы