I would like to add a line (not just vertical or horizontal) to a plotly
chart
library(plotly)
d = data.frame(x=1:10, y=1:10)
plot_ly(d, x = ~x, y = ~y, type='scatter')
Say I want (D) y = 2x
as a line is there a way for me to plot without generating the data myself in another column of d
There at least two ways of simulating abline
.
line
shape to the layout
with the start and end pointThe disadvantage is that the min
and max
for each trace needs to be calculated (Plotly
needs to do that anyway but it bloats the code).
The alternative would be draw the line from one extreme to the other other and then set the xaxis
and yaxis
range
manually.
In the example below the red line is the added trace, while the black line is added via shape
line
.
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
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")
It turns out you can do math right within the add_trace function call where you're saying what y should be. So you can tell plotly to just multiply that column by two right in the argument.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With