【问题标题】:R plotly(): hovertemplate with conditional contentR plotly():带有条件内容的悬停模板
【发布时间】:2021-10-05 19:15:11
【问题描述】:

我有一个旭日形图,并且想显示一些悬停信息,因为标签很长。 一个可重现的小例子:

library(plotly)
library(dplyr)
library(htmlwidgets)
library(widgetframe)
library(stringr)
library(htmltools)

df <- data.frame(lab = c("Eve", "Cain", "Seth", "Enos", "Noam", "Abel", "Awan", "Enoch", "Azura"),
            par= c("", "Eve", "Eve", "Seth", "Seth", "Eve", "Eve", "Awan", "Eve"),
            ID = c(1,11,12,121,122,13,14,141,15),
            parentID =c(NA,1,1,12,12,1,1,14,1),
            val = c(10, 14, 12, 10, 2, 6, 6, 4, 4))

fig2 <- plot_ly(ids=df$ID,
               labels = df$lab,
               parents = df$parentID,
               values = df$val,
               type = 'sunburst',
               maxdepth=2,
               hovertemplate = paste('%{label}','<br>%{value} EUR<extra></extra>','<br>Anteil an %{parent}','%{percentParent: .1%}'),
                            )
fig2
  

对于每个元素,我想在百分比中包含有关父元素份额的信息。 如果我使用,这很好用

hovertemplate = paste('%{label}','<br>%{value} EUR<extra></extra>','<br>Anteil an %{parent}','%{percentParent: .1%}')

导致hoverinfo of Element with parent,显示“Anteil an [parent] x %”

但是对于根元素,由于没有父元素,我得到以下hoverinfo for root element“Anteil an null 100,0 %”。

所以对于根元素,我只想显示第一部分,包括标签和值,但没有“Anteil an null 100,0%”。

到目前为止,我尝试了一个 if else 表达式。

hovertemplate = if (any(is.na(df[,parent]))) {paste('%{label}','<br>%{value} EUR<extra></extra>')} else {paste('%{label}','<br>%{value} EUR<extra></extra>','<br>Anteil an %{parent}','%{percentParent: .1%}')},

那没用。

另外,我找到了一个类似的话题here,但是不知道怎么用。

有没有人有想法,如何像我需要的那样修改悬停信息?

【问题讨论】:

  • 你能提供一个可重现的例子吗?
  • 如果您创建一个小的可重现示例以及预期的输出,这将更容易提供帮助。阅读how to give a reproducible example
  • 我会的,但不幸的是它并不像我想象的那么容易提供一个例子。我需要一些时间,并且能够在两周内提供一个示例。对不起
  • 我现在用一个可重现的示例替换了以前的(无用的)代码。如果有人能解决我的问题,我会很高兴。

标签: r if-statement hover r-plotly sunburst-diagram


【解决方案1】:

你在正确的轨道上。但是,不要使用if,而是使用矢量化ifelse。此外,您可以将 hovertemplate 作为一列添加到您的 df 中,至少在我看来,这使我更容易对 parentID 进行条件处理并产生更清晰的代码:

library(plotly)
library(dplyr)

df <- df %>% 
  mutate(hovertemplate = ifelse(!is.na(parentID),
                                paste('%{label}','<br>%{value} EUR<extra></extra>',
                                      '<br>Anteil an %{parent}','%{percentParent: .1%}'),
                                paste('%{label}','<br>%{value} EUR<extra></extra>')))
fig2 <- plot_ly(ids=df$ID,
                labels = df$lab,
                parents = df$parentID,
                values = df$val,
                type = 'sunburst',
                maxdepth=2,
                hovertemplate = df$hovertemplate,
)
fig2

【讨论】:

  • 感谢您的解决方案,效果很好。
  • 我有一个后续问题:'%{percentParent: .1%}' 的数字格式导致数字和“%”之间没有空格的百分号,例如20,5%。有没有可能在“%”之前插入一个空格?我尝试使用hovertemplate = gsub("%", " %",df$hovertemplate),但它替换了我代码中数字格式的“%”,产生了一个十进制数,例如0,205882... .
猜你喜欢
  • 2015-04-10
  • 1970-01-01
  • 2021-07-30
  • 2016-03-01
  • 2016-12-21
  • 2018-03-25
  • 2021-04-26
  • 2021-04-19
  • 1970-01-01
相关资源
最近更新 更多