R:格式化显示悬停文字

问题描述:

我正在使用R编程语言.我试图学习如何在3d绘图对象中自定义悬停文本,如下所示: https://rstudio-pubs-static.s3.amazonaws.com/441420_9a7c15988f3c4f59b2d828eb87ba1634.html

I am using the R programming language. I trying to learn how to customize hover text in 3d plotly objects as seen here: https://rstudio-pubs-static.s3.amazonaws.com/441420_9a7c15988f3c4f59b2d828eb87ba1634.html

最近,我学习了如何为我模拟的某些数据创建3d图形对象:

Recently, I have learned how to create a 3d plotly object for some data that I simulated :

  library(Rtsne)
    library(dplyr)
    library(ggplot2)
    library(plotly)
    library(caret)
    library(randomForest)
    
  #data
a = iris
a <- unique(a)

#create two species just to make things easier
s <- c("a","b")
species<- sample(s , 149, replace=TRUE, prob=c(0.3, 0.7))
a$species = species
a$species = as.factor(a$species)

#split data into train/test, and then random forest 

index = createDataPartition(a$species, p=0.7, list = FALSE)
train = a[index,]
test = a[-index,]

rf = randomForest(species ~ ., data=train, ntree=50, mtry=2)

#have the model predict the test set
pred = predict(rf, test, type = "prob")
labels = as.factor(ifelse(pred[,2]>0.5, "a", "b"))
confusionMatrix(labels, test$species)


#tsne algorithm
tsne_obj_3 <- Rtsne(test[,-5], perplexity=1, dims=3)
df_m2 <- as.data.frame(tsne_obj_3$Y)

df_m2$labels = test$species

df_m2$color = ifelse(df_m2$labels == "a", "red","blue")
df_m2$petal_length = test$Petal.Length

axis_1 = df_m2$V1
axis_2 = df_m2$V2
axis_3 = df_m2$V3

plot_ly(x=as.vector(axis_1),
        y=as.vector(axis_2), 
        z=axis_3, 
        type="scatter3d",
        mode="markers", 
        name = "Obs", 
        marker = list(size = 3)) %>% 
   add_mesh(x=as.vector(axis_1), 
            y=as.vector(axis_2), 
            z=df_m2$pred, 
            type = "mesh3d", 
            name = "Preds")

现在,我正在尝试自定义此绘图对象,以便在将鼠标移到每个点上时出现不同的标签,并且与给定类相对应的点都具有相同的颜色:

Now, I am trying to customize this plotly object so that different labels appear when you move the mouse over each point, and points corresponding to a given class all have the same color:

p <- plot_ly(type = 'scatter3d', mode = 'markers', colors = "Accent", color = df_m2$color) %>%
  add_trace(
    x = df_m2$V1,
    y = df_m2$V2,
    z = df_m2$V3,
    marker = list(
      size = 3),
    name = df_m2$labels,
    text = paste("Species: ", df_m2$labels ; "Width: ", df_m2$petal.width ; "color: ", df_m2$color" ),
    showlegend = T
  )  %>%


   add_mesh(x=as.vector(axis_1), 
            y=as.vector(axis_2), 
            z=df_m2$pred, 
            type = "mesh3d", 
            name = "Preds")
  %>% 
  layout(
    title = "none",
    titlefont = list(
      size = 10
    ),
    paper_bgcolor = "#fffff8",
    font = t,
    xaxis = list(
      zeroline = F
    ),
    yaxis = list(
      hoverformat = '.2f',
      zeroline = F
    )
  )  

p

但是,这里有一个错误.有人可以告诉我我在做什么错吗?

However, there is an error here. Can someone please show me what I am doing wrong?

谢谢

不确定所要预测的类到底要做什么,但是也许是这样?(颜色对应于真实的物种,鼠标悬停也显示预测).

Not sure what exactly you want to do with the predicted classes, but maybe something like this? (Color corresponds to real species, mouseover also shows prediction).

library(reprex)
reprex({
suppressPackageStartupMessages(invisible(
  lapply(c("Rtsne", "dplyr", "ggplot2", "plotly", "caret", "randomForest"),
         require, character.only = TRUE)))

#data
a <- unique(iris)

#create two species just to make things easier
set.seed(123)
a$species <- factor(sample(c("a", "b"), 149, replace=TRUE, prob=c(0.3, 0.7)))

#split data into train/test, and then random forest 
index = createDataPartition(a$species, p=0.7, list = FALSE)
train = a[index,]
test = a[-index,]

rf <- randomForest(species ~ ., data=train, mtry=2)

#have the model predict the test set
pred <- predict(rf, test, type = "prob")
labels <- predict(rf, test)
confusionMatrix(labels, test$species)

#tsne algorithm
tsne_obj_3 <- Rtsne(test[,-5], perplexity=1, dims=3)
df_m2 <- as.data.frame(tsne_obj_3$Y)

df_m2$labels = toupper(test$species)
df_m2$pred <- labels # you did not define but call pred in plot_ly call
df_m2$color = ifelse(df_m2$labels == "A", "red", "blue")
df_m2$petal_length = test$Petal.Length

axis_1 <- df_m2$V1
axis_2 <- df_m2$V2
axis_3 <- df_m2$V3

plot_ly(type = 'scatter3d', mode = 'markers', colors = c("blue", "red"), 
        color = df_m2$color) %>%
  add_trace(
    x = df_m2$V1,
    y = df_m2$V2,
    z = df_m2$V3,
    marker = list(size = 3),
    name = df_m2$pred,
    text = paste0("Species: ", df_m2$labels, "; Length: ",df_m2$petal_length, "; color: ", df_m2$color),
    showlegend = TRUE)  %>%

   add_mesh(x=as.vector(axis_1), 
            y=as.vector(axis_2), 
            z=axis_3, # not sure what z you want here
            type = "mesh3d", 
            name = "Preds") %>% 
  
  layout(
    title = "none",
    titlefont = list(size = 10),
    paper_bgcolor = "#fffff8",
                 font = "Open Sans",
                 xaxis = list(zeroline = FALSE),
                 yaxis = list(hoverformat = '.2f', zeroline = FALSE)
    )