如何为 Plotly 箱线图制作自定义悬停信息标签?
Posted
技术标签:
【中文标题】如何为 Plotly 箱线图制作自定义悬停信息标签?【英文标题】:How to make a custom hoverinfo lables for Plotly boxplot? 【发布时间】:2018-05-10 14:24:21 【问题描述】:基本上我对当前版本的 Plotly 有一个问题,它不能正确显示箱形图的 hoverinfo。它省略了标签(最小值、最大值、中值等),所以当我绘制以下图时:
plot_ly(y = ~rnorm(50), type = "box")
我没有必要的标签。
我有没有办法给自定义悬停标签,使它们像这样 Max: 1.97, q3: 0.84, Median: 0.25 etc.?
我的 Plotly 版本是“4.7.1”
【问题讨论】:
我不知道 7 天是否足够下一个 Plotly 版本:github.com/plotly/plotly.js/pull/2094 不确定,但由于您添加了 javascript 标签,您是否考虑过 D3 (d3js.org)。这是能够完全自定义所有内容的方法……但您需要一份值得付出努力的工作。 @MikeWilliamson 是的,我放了 javascript 标签,因为我希望有一个简单的 javascript 修复程序。我希望他们在下一个版本中修复它。 【参考方案1】:这是一个使用 ggplot2 的示例,您可以通过它映射到 plotly。
我希望它可以帮助您指明正确的方向。最新版本的 plotly 和 ggplot2 现在确实显示悬停值。我的方法是创建文本标签,因为这使我可以滚动到我可以使用的模板函数中。
T.
图形输出(ggplot2)
图形输出(情节)
代码示例
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 进行数据分析和图形,第三版作者:John Maindonald; W.约翰布劳恩这本书非常详细地介绍了基本包,它于 2010 年出版,仍然是一个很好的洞察力来源。
【讨论】:
【参考方案2】:从 github 安装最新的开发版本可以解决问题,请参阅 issue #1160 on github
【讨论】:
谢谢。确实如此。希望正式版快点到来。以上是关于如何为 Plotly 箱线图制作自定义悬停信息标签?的主要内容,如果未能解决你的问题,请参考以下文章
Plotly:如何为标准偏差制作具有多条线和阴影区域的图形?
R语言plotly可视化:plotly可视化二维直方图等高线图在等高线上添加数值标签自定义标签字体色彩设置鼠标悬浮显示效果(Styled 2D Histogram Contour)