gpt4 book ai didi

r - 根据未在 x、y、颜色映射/plot_ly 条件文本中使用的辅助子分组,有条件地为热图单元格分配颜色和标签

转载 作者:行者123 更新时间:2023-12-04 15:49:53 25 4
gpt4 key购买 nike

这是我的数据集的示例:

sampleData <- structure(list(LEVELS = structure(c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 
4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 2L, 3L, 1L,
1L), .Label = c("A", "B", "C", "D"), class = "factor"), GROUP = structure(c(1L,
1L, 1L, 1L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 2L, 2L, 2L, 2L, 5L,
5L, 5L, 5L, 1L, 1L, 5L, 1L), .Label = c("AUD", "CTO", "KOP",
"PIL", "POH"), class = "factor"), MEMBER = structure(c(17L, 18L,
19L, 20L, 6L, 7L, 3L, 11L, 10L, 2L, 8L, 5L, 12L, 9L, 1L, 4L,
14L, 15L, 13L, 16L, 17L, 17L, 13L, 19L), .Label = c("AS", "Ca",
"Fc", "FFZ", "Fg", "Fo", "Fp", "Fv", "GH1", "Lp", "Nb", "Qc",
"Rq1", "Rt", "Rt2", "Rtcz", "T1", "T2", "T3", "T4"), class = "factor"),
VALUE = c(0.001, 1, 0.3, 0.04, 0.1, 0.2, 0.06, 0.08, 0.12,
1, 1, 0.3, 0.99, 0.56, 0.54, 0.7, 0.09, 0.1, 0.95, 0.001,
0.01, 0.15, 0.005, 0.001)), class = "data.frame", row.names = c(NA,
-24L))

   LEVELS GROUP MEMBER VALUE
1 A AUD T1 0.001
2 B AUD T2 1.000
3 C AUD T3 0.300
4 D AUD T4 0.040
5 A KOP Fo 0.100
6 B KOP Fp 0.200
7 C KOP Fc 0.060
8 D KOP Nb 0.080
9 A PIL Lp 0.120
10 B PIL Ca 1.000
11 C PIL Fv 1.000
12 D PIL Fg 0.300
13 A CTO Qc 0.990
14 B CTO GH1 0.560
15 C CTO AS 0.540
16 D CTO FFZ 0.700
17 A POH Rt 0.090
18 B POH Rt2 0.100
19 C POH Rq1 0.950
20 D POH Rtcz 0.001
21 B AUD T1 0.010
22 C AUD T1 0.150
23 A POH Rq1 0.005
24 A AUD T3 0.001


我要展示 LEVELSy axisGROUPx .如 VALUE < 0.05相应的单元格将是 red .

但每个 GROUP有几个 MEMBER s。 即使一个MEMBER在特定 GROUP:LEVELS对 < 0.05 单元格应该是红色 .不需要 GROUP:LEVELS 的所有成员对小于 0.05 为该单元格分配红色。 但是我想举报ALL MEMBER的名字每个 GROUP:LEVELS 中 < 0.05 的 s一对。

这是满足此条件的案例的一个示例:

   LEVELS GROUP MEMBER VALUE
1 A AUD T1 0.001
24 A AUD T3 0.001


因此,如果我将鼠标悬停在单元格 A:AUD 上我希望看到两个 T1T3报道。

重申;
  • 即使只有一个 MEMBER,我也想确保为某个单元格分配红色有 VALUE < 0.05 .
  • 如果有多个成员满足 VALUE < 0.05条件,我想报告所有这些 MEMBER在我的 plotly 文本中的名字。

  • 我怎样才能做到这一点?

    我当前的代码如下,即使在某个 GROUP:LEVELS 中有一个成员,它似乎也能很好地显示红细胞。对有 VALUE < 0.05 .但是 plotly只报告一个人的名字 MEMBER即使有更多 MEMBER具有 VALUE < 0.05 的 s .
    library(plotly)
    library(dplyr)

    vals <- unique(scales::rescale(c(sampleData$VALUE)))
    o <- order(vals, decreasing = FALSE)
    cols <- scales::col_numeric("Blues", domain = NULL)(vals)
    colz <- setNames(data.frame(vals[o], cols[o]), NULL)
    names(colz) <- c("var","col")
    colz$col <- as.character(colz$col)

    colz <- dplyr::mutate(colz, col = replace(col, var < 0.05, "#ff3300"))

    plotly::plot_ly(data = sampleData,
    x = ~GROUP,
    y = ~LEVELS,
    z = ~VALUE,
    type = "heatmap",
    xgap = 0.5, ygap = 0.2,
    hoverinfo = 'text',
    text = ~paste('</br> Member: ', MEMBER),
    colorscale = colz
    )

    最佳答案

    一个解决方案是在 sampleData 中创建一个新列它将保存标签,然后在对 plot_ly() 的调用中引用这个新专栏而不是 MEMBER .通过这种方式,您可以将标签自定义为您喜欢的任何内容 - 因此在这种情况下,我们可以在必要时聚合多个标签,并且仅显示具有至少一个值 < 0.05 的单元格的标签。

    下面插入了新代码,并对 plot_ly() 稍作改动。称呼。它所做的是创建一个 labels过滤数据框sampleData到值 < 0.05 的行。然后它通过在 上分组来聚合标签。级别:组 - 例如为 A:澳元 标签将是“T1 T3”。然后这些标签被合并(或者更确切地说 join ed)回到 sampleData , 带有“Member: ”文本,并且标签设置为我们不希望显示标签的空字符串。然后在 plot_ly()调用您只需引用label柱子。

    library(plotly)
    library(dplyr)

    vals <- unique(scales::rescale(c(sampleData$VALUE)))
    o <- order(vals, decreasing = FALSE)
    cols <- scales::col_numeric("Blues", domain = NULL)(vals)
    colz <- setNames(data.frame(vals[o], cols[o]), NULL)
    names(colz) <- c("var","col")
    colz$col <- as.character(colz$col)

    colz <- dplyr::mutate(colz, col = replace(col, var < 0.05, "#ff3300"))

    # filter data to values < 0.05
    labels <- filter(sampleData, VALUE < 0.05)
    # aggregate the labels for each unique combination of LEVEL:GROUP
    labelsAgg <- aggregate(labels$MEMBER, list(labels$LEVELS, labels$GROUP), paste, collapse = " ")
    # set names to match sampleData
    labelsAgg <- setNames(labelsAgg, c("LEVELS", "GROUP", "label"))
    # prepend "Member" heading, must do this here so that labels we want to be blank are truly blank
    labelsAgg$label <- paste("</br> Member: ", labelsAgg$label)
    # merge/join labels back with sampleData, using merge() here messed up the factors, so using left_join() is a workaround
    sampleData <- left_join(sampleData, labelsAgg, by = c("LEVELS", "GROUP"))
    # replace NA with empty string, otherwise "NA" appears as the label
    sampleData[is.na(sampleData$label), "label"] <- ""

    # note the text parameter is simply the label now, i.e. the new column sampleData$label
    plotly::plot_ly(data = sampleData,
    x = ~GROUP,
    y = ~LEVELS,
    z = ~VALUE,
    type = "heatmap",
    xgap = 0.5, ygap = 0.2,
    hoverinfo = 'text',
    text = ~paste(label),
    colorscale = colz
    )

    如果您更喜欢逗号分隔符而不是空格,则可以使用collapse 参数轻松更改标签的格式。

    如果您愿意,您当然可以稍微整理添加的代码,尽管它似乎可以解决问题。

    enter image description here

    关于r - 根据未在 x、y、颜色映射/plot_ly 条件文本中使用的辅助子分组,有条件地为热图单元格分配颜色和标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57411774/

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