library(plotly)
data <- data.frame(name = c("Ana", "Ana", "Joyce", "Joyce", "Kam", "Kam"),
type = c("A", "B", "A", "B", "A", "B"),
score1 = c(100, 90, 0, 20, 33, 99),
score2 = c(100, 30, 0, 20, 55, 66))
> data
name type score1 score2
1 Ana A 100 100
2 Ana B 90 30
3 Joyce A 0 0
4 Joyce B 20 20
5 Kam A 33 55
6 Kam B 99 66
I have a dataset where each person has 2 scores for test type A
and 2 scores for test type B
. I want to connect the test scores for each person with a dashed line.
Here's my code for the plot without the dashed lines:
> plot_ly(data = data,
x = ~score1,
y = ~score2,
hoverinfo = 'text',
text = ~I(name),
mode = "markers",
transforms = list(
list(
type = 'groupby',
groups = data$type,
styles = list(
list(target = "A", value = list(marker =list(color = 'red'))),
list(target = "B", value = list(marker =list(color = 'blue')))
)
)
))
The desired output is something like this:
CodePudding user response:
Since you're specifying specific colors in the point plot, it's just going to be easier to create the lines first.
First, for each line segment, you will need a separate trace. There are only three, but I used this method due to its dynamic nature. Your line segments are connected by the data in name
, so I used that to control the line trace creation.
plt <- plot_ly()
lapply(1:length(unique(df1$name)),
function(j) {
df2 <- filter(df1, name == unique(df1$name)[j])
plt <<- plt %>%
add_trace(type = "scatter", mode = "lines", data = df2,
x = ~score1, y = ~score2, showlegend = F, hoverinfo = "none",
line = list(color = "black", dash = "dash"))
})
Now that the lines are all documented in plt
, let's add that original scatter data to the plot. I've added hovertemplate
so that the hover content doesn't include the trace name.
plt %>%
add_trace(data = df1, x = ~score1, y = ~score2, hovertext = ~name,
color = ~type, mode = "markers", showlegend = T,
hovertemplate = "%{hovertext}<extra></extra>",
marker = list(color = ifelse(df1$type == "A", "red", "blue")))