Добавление сегментов стрелок к точечной диаграмме
Я имею XY
Данные, которые я хочу построить в точечной диаграмме, используя R
"s plotly
package
, Для некоторых точек у меня есть стрелки, определенные их начальными и конечными координатами X и Y, которые я также хочу построить.
Вот данные:
set.seed(1)
df <- data.frame(x=rnorm(100),y=rnorm(100),
arrow.x.start=NA,arrow.y.start=NA,
arrow.x.end=NA,arrow.y.end=NA)
arrow.idx <- sample(100,20,replace = F)
df$arrow.x.start[arrow.idx] <- df$x[arrow.idx]
df$arrow.x.end[arrow.idx] <- df$arrow.x.start[arrow.idx]+runif(length(arrow.idx),-0.5,0.5)
df$arrow.y.start[arrow.idx] <- df$y[arrow.idx]
df$arrow.y.end[arrow.idx] <- df$arrow.y.start[arrow.idx]+runif(length(arrow.idx),-0.5,0.5)
С помощью ggplot2
это достигается с помощью:
library(ggplot2)
ggplot(df,aes(x=x,y=y))+geom_point()+theme_minimal()+
geom_segment(aes(x=arrow.x.start,y=arrow.y.start,xend=arrow.x.end,yend=arrow.y.end),arrow=arrow())
Который дает:
В plotly
это построит точки:
plotly::plot_ly(marker=list(size=5,color="black"),type='scatter',mode="markers",x=df$x,y=df$y,showlegend=F) %>%
plotly::layout(xaxis=list(title="x",zeroline=F,showticklabels=F,showgrid=F,showgrid=F),yaxis=list(title="y",zeroline=F,showticklabels=F,showgrid=F,showgrid=F))
Поэтому я пытаюсь понять, как добавить стрелки.
add_segments
имеет x
, xend
, y
, а также yend
аргументы и добавление, что:
plotly::plot_ly(marker=list(size=5,color="black"),type='scatter',mode="markers",x=df$x,y=df$y,showlegend=F) %>%
plotly::layout(xaxis=list(title="x",zeroline=F,showticklabels=F,showgrid=F,showgrid=F),yaxis=list(title="y",zeroline=F,showticklabels=F,showgrid=F,showgrid=F)) %>%
plotly::add_segments(x=df$arrow.x.start,xend=df$arrow.x.end,y=df$arrow.y.start,yend=df$arrow.y.end,line=list(color="blue"))
Кажется, добавить точку в конце строки:
И я не смог найти в его документации аргумент, который добавит наконечник стрелки в конце строки.
Любая идея?
1 ответ
Решение
Вы можете использовать аннотации
plot_ly(df) %>%
add_markers(~x, ~y) %>%
add_annotations( x = ~arrow.x.end,
y = ~arrow.y.end,
xref = "x", yref = "y",
axref = "x", ayref = "y",
text = "",
showarrow = T,
ax = ~arrow.x.start,
ay = ~arrow.y.start)