【问题标题】:Plotly: How to add a median line on a box plotPlotly:如何在箱线图上添加中线
【发布时间】:2020-05-22 00:21:09
【问题描述】:

我想在箱形图上添加一条中线。

喜欢这个

到目前为止,这是我的情节:

library(plotly)
p <- plot_ly(y = ~rnorm(50), type = "box") %>%
  add_trace(y = ~rnorm(50, 1))

p

【问题讨论】:

  • 您介意生成完整的mcve 吗?我可以很容易地用 python 实现这一点,而且通常这两个版本具有相同的功能。
  • @Sup'A 我的建议对你有什么效果?

标签: r plotly boxplot r-plotly


【解决方案1】:

从使用plot_ly(..., type='scatter', mode='lines', ...) 的散点图开始,然后每个箱线图绘制一个add_boxplot(...' inherit=FALSE, ...)。以下是整个 data.frame 的操作方法:

带有示例数据的完整代码:

library(dplyr)
library(plotly)

# data
df <- data.frame(iris) %>% select(-c('Species'))
medians <- apply(df,2,median)

# create common x-axis values for median line and boxplots
xVals <- seq(0, length(medians)-1, by=1)

# plotly median line setup
p <- plot_ly(x = xVals, y=medians, type='scatter', mode='lines', name='medians')

# add a trace per box plot
i <- 0
for(col in names(df)){
  p <- p %>% add_boxplot(y = df[[col]], inherit = FALSE, name = col)
  i <- i + 1
}

# manage layout
p <- p %>% layout(xaxis = list(range = c(min(xVals)-1, max(xVals)+1)))
p

【讨论】:

  • 如果我的数据中没有 medain 列,我可以使用这个技巧吗?我尝试使用medians &lt;- median(c(t1$CTQ)),但它会计算所有行
  • @Sup'A 如果您愿意,我们可以在chatroom 中讨论更多信息。
【解决方案2】:

另一种选择是使用ggplot2并将其转换为plotly

library(ggplot2)
library(dplyr)
library(tidyr)
library(plotly)

p = iris %>% pivot_longer(-Species) %>%
 ggplot(aes(x=name,y=value,col=name)) + 
geom_boxplot() + stat_summary(inherit.aes = FALSE,
aes(x=name,y=value,group=1),fun.y=median,geom="line")
ggplotly(p)

简单解释一下代码,我使用tidyr中的pivot_longer将数据框转换为长格式,并首先制作了列名作为x变量和颜色的箱线图。

stat_summary部分,我再次指定了相同的x和y变量,这次省略了颜色,加上group=1,这告诉stat_summary将整个数据框视为一组,并总结每个 x 组的所有 y 值,并通过它画一条线。

【讨论】:

    猜你喜欢
    • 2020-05-28
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多