gpt4 book ai didi

r - 如何为 R 中的绘图箱线图自定义悬停文本

转载 作者:行者123 更新时间:2023-12-04 15:17:55 27 4
gpt4 key购买 nike

我了解如何为 plotly 中的散点图自定义悬停文本,但箱线图不接受“文本”属性。 Warning message: 'box' objects don't have these attributes: 'text' 。我有超过 300 个 x 轴变量,并且有两个组(A 或 B)中的编号样本(1-50),我想在同一个箱线图中一起绘制,然后我想区分样本编号和将光标移到异常值上时,通过悬停文本进行分组。我想要我的自定义数据标签而不是自动四分位数标签。 plotly 箱线图可以实现吗?

library(plotly) 
library(magrittr)

plot_ly(melt.s.data,
x = ~variable,
y = ~value,
type = 'box',
text = ~paste("Sample number: ", Sample_number,
'<br>Group:', Group)) %>%
layout(title = "Individual distributions at each x")

plotly box plot with quartile information in hover info
这是一些仅显示 5 个变量的示例数据(但代码在推断到我的 300 时应该可以工作)...
#sample data
set.seed(456)
#Group A
sample.data_a <- data.frame(Class = "red", Group = "A",
Sample_number = seq(1,50,by=1),
x1= rnorm(50,mean=0, sd=.5),
x2= rnorm(50,mean=0.5, sd=1.5),
x3= rnorm(50,mean=5, sd=.1),
x4= rnorm(50,mean=0, sd=3.5),
x5= rnorm(50,mean=-6, sd=.005))
#Group B
sample.data_b <- data.frame(Class = "red", Group = "B",
Sample_number = seq(1,50,by=1),
x1= rnorm(50,mean=0, sd=5.5),
x2= rnorm(50,mean=0.5, sd=7.5),
x3= rnorm(50,mean=5, sd=.01),
x4= rnorm(50,mean=0, sd=.5),
x5= rnorm(50,mean=-6, sd=2.05))

#row Bind groups
sample.data <- rbind(sample.data_a, sample.data_b)

#melting data to have a more graphable format
library(reshape2)
melt.s.data<-melt(sample.data, id.vars=c("Class", "Group","Sample_number"))

以下是类似的问题:
  • Here 似乎不可能。
  • 这个 question 类似,只是想添加相关的四分位数信息。
  • 而这个 question 只是 plotly 箱线图中的一个点。
  • 最佳答案

    Shiny 是可能的。

    library(plotly)
    library(shiny)
    library(htmlwidgets)

    # Prepare data ----
    set.seed(456)
    #Group A
    sample.data_a <- data.frame(Class = "red", Group = "A",
    Sample_number = seq(1,50,by=1),
    x1= rnorm(50,mean=0, sd=.5),
    x2= rnorm(50,mean=0.5, sd=1.5),
    x3= rnorm(50,mean=5, sd=.1),
    x4= rnorm(50,mean=0, sd=3.5),
    x5= rnorm(50,mean=-6, sd=.005))
    #Group B
    sample.data_b <- data.frame(Class = "red", Group = "B",
    Sample_number = seq(1,50,by=1),
    x1= rnorm(50,mean=0, sd=5.5),
    x2= rnorm(50,mean=0.5, sd=7.5),
    x3= rnorm(50,mean=5, sd=.01),
    x4= rnorm(50,mean=0, sd=.5),
    x5= rnorm(50,mean=-6, sd=2.05))
    #row Bind groups
    sample.data <- rbind(sample.data_a, sample.data_b)
    #melting data to have a more graphable format
    melt.s.data <- reshape2::melt(sample.data,
    id.vars=c("Class", "Group", "Sample_number"))

    # Plotly on hover event ----
    addHoverBehavior <- c(
    "function(el, x){",
    " el.on('plotly_hover', function(data) {",
    " if(data.points.length==1){",
    " $('.hovertext').hide();",
    " Shiny.setInputValue('hovering', true);",
    " var d = data.points[0];",
    " Shiny.setInputValue('left_px', d.xaxis.d2p(d.x) + d.xaxis._offset);",
    " Shiny.setInputValue('top_px', d.yaxis.l2p(d.y) + d.yaxis._offset);",
    " Shiny.setInputValue('dy', d.y);",
    " Shiny.setInputValue('dtext', d.text);",
    " }",
    " });",
    " el.on('plotly_unhover', function(data) {",
    " Shiny.setInputValue('hovering', false);",
    " });",
    "}")

    # Shiny app ----
    ui <- fluidPage(
    tags$head(
    # style for the tooltip with an arrow (http://www.cssarrowplease.com/)
    tags$style("
    .arrow_box {
    position: absolute;
    pointer-events: none;
    z-index: 100;
    white-space: nowrap;
    background: CornflowerBlue;
    color: white;
    font-size: 13px;
    border: 1px solid;
    border-color: CornflowerBlue;
    border-radius: 1px;
    }
    .arrow_box:after, .arrow_box:before {
    right: 100%;
    top: 50%;
    border: solid transparent;
    content: ' ';
    height: 0;
    width: 0;
    position: absolute;
    pointer-events: none;
    }
    .arrow_box:after {
    border-color: rgba(136,183,213,0);
    border-right-color: CornflowerBlue;
    border-width: 4px;
    margin-top: -4px;
    }
    .arrow_box:before {
    border-color: rgba(194,225,245,0);
    border-right-color: CornflowerBlue;
    border-width: 10px;
    margin-top: -10px;
    }")
    ),
    div(
    style = "position:relative",
    plotlyOutput("myplot"),
    uiOutput("hover_info")
    )
    )

    server <- function(input, output){
    output$myplot <- renderPlotly({
    plot_ly(melt.s.data,
    type = "box",
    x = ~variable, y = ~value,
    text = paste0("<b> group: </b>", melt.s.data$Group, "<br/>",
    "<b> sample: </b>", melt.s.data$Sample_number, "<br/>"),
    hoverinfo = "y") %>%
    onRender(addHoverBehavior)
    })
    output$hover_info <- renderUI({
    if(isTRUE(input[["hovering"]])){
    style <- paste0("left: ", input[["left_px"]] + 4 + 5, "px;", # 4 = border-width after
    "top: ", input[["top_px"]] - 24 - 2 - 1, "px;") # 24 = line-height/2 * number of lines; 2 = padding; 1 = border thickness
    div(
    class = "arrow_box", style = style,
    p(HTML(input$dtext,
    "<b> value: </b>", formatC(input$dy)),
    style="margin: 0; padding: 2px; line-height: 16px;")
    )
    }
    })
    }

    shinyApp(ui = ui, server = server)

    enter image description here

    关于r - 如何为 R 中的绘图箱线图自定义悬停文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49495472/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com