繁体   English   中英

R:格式化 plotly hover 文本

[英]R: formatting plotly hover text

我正在使用 R 编程语言。 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 plotly object:

  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")

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

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

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

谢谢

不确定你想对预测的类做什么,但可能是这样的? (颜色对应真实物种,鼠标悬停也显示预测)。

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)
    )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM