如何为 Plotly boxplot 制作自定义 hoverinfo 标签?
How to make a custom hoverinfo lables for Plotly boxplot?
基本上我对当前版本的 Plotly 有一个问题,它不能正确显示箱线图的悬停信息。它省略了标签(最小值、最大值、中值等),所以当我绘制以下图时:
plot_ly(y = ~rnorm(50), type = "box")
我没有必要的标签。
有没有办法让我提供自定义悬停标签,使它们像这样最大:1.97,q3:0.84,中位数:0.25 等?
我的 Plotly 版本是“4.7.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 年出版,仍然是一个很好的见解来源。
从 github 安装最新的开发版本解决了问题,请参阅问题 #1160 on github
基本上我对当前版本的 Plotly 有一个问题,它不能正确显示箱线图的悬停信息。它省略了标签(最小值、最大值、中值等),所以当我绘制以下图时:
plot_ly(y = ~rnorm(50), type = "box")
我没有必要的标签。
有没有办法让我提供自定义悬停标签,使它们像这样最大:1.97,q3:0.84,中位数:0.25 等?
我的 Plotly 版本是“4.7.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 年出版,仍然是一个很好的见解来源。
从 github 安装最新的开发版本解决了问题,请参阅问题 #1160 on github