R plotly():带有条件内容的悬停模板
R plotly(): hovertemplate with conditional content
我有一个朝阳图,由于标签很长,我想展示一些悬停信息。
一个可重现的小例子:
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%}')},
那没用。
另外,我找到了一个类似的主题,但不知道如何使用它。
有人知道如何修改我需要的 hoverinfo 吗?
你走在正确的轨道上。但是,不要使用 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
我有一个朝阳图,由于标签很长,我想展示一些悬停信息。 一个可重现的小例子:
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%}')},
那没用。
另外,我找到了一个类似的主题
有人知道如何修改我需要的 hoverinfo 吗?
你走在正确的轨道上。但是,不要使用 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