R:格式化情节悬停文本 [英] R: formatting plotly hover text

查看:18
本文介绍了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")

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

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

这篇关于R:格式化情节悬停文本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆