如何为Plotly箱线图制作自定义的悬停信息标签?

6
基本上,我有一个关于当前版本的 Plotly 的问题,它不能正确地显示箱线图的悬停信息。它会省略标签(如最小值、最大值、中位数等),所以当我绘制以下图表时:
plot_ly(y = ~rnorm(50), type = "box")

无中位数、最小值和最大值标签的箱线图

我没有必要的标签。

有没有办法让我自定义悬停标签,使它们像这样:Max: 1.97,q3: 0.84,Median: 0.25 等等?

我的Plotly版本是‘4.7.1’


3
不确定7天是否足够进行下一次 Plotly 发布:https://github.com/plotly/plotly.js/pull/2094 - Maximilian Peters
1
不确定,但既然您添加了Javascript标签,是否考虑过D3(https://d3js.org/)?这是完全自定义一切的方法...但需要值得付出的工作。 - Mike Williamson
@MikeWilliamson 是的,我加了 JavaScript 标签,因为我希望有一个简单的 JavaScript 解决方案。希望他们在下一个版本中修复它。 - magasr
2个回答

2
这里有一个使用ggplot2的例子,你可以通过它来制作plotly图表。
我希望它能帮助你找到正确的方向。最新版本的plotly和ggplot2现在都显示悬停值。我的方法是创建文本标签,因为这样可以将其转换成模板函数以供使用。
T.
图形输出(ggplot2)

enter image description here

图形输出(Plotly)

enter image description here

代码示例
require(DAAG)
require(ggplot2)
require(plotly)
data("possum")

dset <- possum
here <- possum$sex == "f"
dname <- as.character(substitute(possum))
xnam <- as.character(substitute(x))
x <- dset[here, "totlngth"]

yLabel <- c("Total length (cm)")

## Pull in boxplot stats for use in mapping data later to boxplot
z <- boxplot.stats(x)
xlim <- range(c(z$stats, z$out))
xlim <- xlim + c(-0.025, 0.05) * diff(xlim)
ylim <- c(0.55, 1.5)

top <- 0.7
chh <- par()$cxy[2]
chw <- par()$cxy[1]

gp <- ggplot(data = possum, aes(y = totlngth, x = ""))
gp <- gp + stat_boxplot(geom = 'errorbar', width = .1)
gp <- gp + geom_boxplot(#width = .3,
                        outlier.color = "blue",
                        outlier.shape = 2)
gp <- gp + stat_summary(fun.y = mean,
                        geom = "point",
                        shape = 5,
                        size = 4)
gp <- gp + xlab(NULL)
gp <- gp + ylab(yLabel)
gp <- gp + theme(axis.ticks.x = element_blank(),
                 panel.grid.major = element_blank(),
                 panel.grid.minor = element_blank(),
                 panel.background = element_blank())

gp <- gp + geom_text(data = data.frame(), aes(x = top + 1.5 * chh,
                                            y = z$stats[5],
                                            label = "Largest value \n(there are no outliers)"
                                            ))

gp <- gp + geom_text(data = data.frame(), aes(x = top + 1.5 * chh,
                                              y = z$stats[4],
                                              label = "upper quartile"
                                              ))

gp <- gp + geom_text(data = data.frame(), aes(x = top + 1.5 * chh,
                                              y = z$stats[3],
                                              label = "median"
                                              ))

gp <- gp + geom_text(data = data.frame(), aes(x = top + 1.5 * chh,
                                              y = z$stats[2],
                                              label = "lower quartile"
                                              ))

gp <- gp + geom_text(data = data.frame(), aes(x = top + 1.5 * chh,
                                              y = z$stats[1],
                                              label = "Smallest value \n(outliers excepted)"
                                              ))
if (!is.null(z$out)) {
  gp <- gp + geom_text(data = data.frame(), aes(x = top + 1.5 * chh,
                                              y = z$out[1],
                                              label = "Outlier \n"
                                              ))
  # Display outlier
  gp <- gp + geom_text(data = data.frame(), aes( x = rep(top - chh, 2),
                                                 y = z$out[1] + .5,
                                                 label = c(format(round(z$out[1], 2)))))

}

av <- mean(z$stats[c(2, 4)])
q1 <- z$stats[2]
q3 <- z$stats[4]
qtop <- q3 + 0.5 * chh


# Largest Value
gp <- gp + geom_text(data = data.frame(), aes( x = rep(top - chh, 2),
                                               y = z$stats[5],
                                               label = c(format(round(z$stats[5], 2)))))


# Upper Quartile
gp <- gp + geom_text(data = data.frame(), aes( x = rep(top - chh, 2),
                                               y = q1,
                                               label = c(format(round(q1, 2)))))

# Lower Quartile
gp <- gp + geom_text(data = data.frame(), aes( x = rep(top - chh, 2),
                                               y = q3,
                                               label = c(format(round(q3, 2)))))

gp

p <- ggplotly(gp)
p

注意:上面的代码是基于以下书籍中的一个基本图形包箱线图示例进行演进的:
  • 《使用R进行数据分析和图形展示,第三版》By: John Maindonald; W. John Braun

该书详细介绍了基本包,它于2010年出版,仍然是一个很好的洞察源。


1
从github安装最新的dev版本可以解决这个问题,请参见github上的#1160问题

谢谢。没错。希望官方发布很快。 - magasr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接