簡體   English   中英

Boxplot與ggplot2

[英]Boxplot with ggplot2

我正在研究一個帶有預測和觀測的箱線圖,這是一個非常長的數據集。 我在這里提供樣本格式。

> forecasts <- data.frame(f_type = c(rep("A", 9), rep("B", 9)), 
                          Date = c(rep(as.Date("2007-01-31"),3), rep(as.Date("2007-02-28"), 3), rep(as.Date("2007-03-31"), 3), rep(as.Date("2007-01-31"), 3), rep(as.Date("2007-02-28"), 3), rep(as.Date("2007-03-31"), 3)), 
                          value = c(10, 50, 60, 05, 90, 20, 30, 46, 39, 69, 82, 48, 65, 99, 75, 15 ,49, 27))
> 
> observation <- data.frame(Dt = c(as.Date("2007-01-31"), as.Date("2007-02-28"), as.Date("2007-03-31")), 
                            obs = c(30,49,57))

到目前為止,我有:

ggplot() + 
    geom_boxplot(data = forecasts,
                 aes(x = as.factor(Date), y = value, 
                     group = interaction(Date, f_type), fill = f_type)) +  
    geom_line(data = observations,
              aes(x = as.factor(Dt), y = obs, group = 1), 
              size = 2)

有了這個,默認情況下設置框和胡須。 我想分配這些值,以便我知道胡須的范圍。 我試圖用stat_summary傳遞一個函數,如:

f <- function(x) {
    r <- quantile(x, probs = c(0.05, 0.25, 0.5, 0.75, 0.95))
    names(r) <- c("ymin", "lower", "middle", "upper", "ymax")
    r
}

o <- function(x) {
    subset(x, x < quantile(x,probs = 0.05) | quantile(x,probs = 0.95) < x)
}

ggplot(forecasts, aes(x = as.factor(Date), y = value)) + 
    stat_summary(fun.data = f, geom = "boxplot", aes(group = interaction(Date, f_type), fill = f_type)) +
    stat_summary(fun.y = o, geom = "point") 

但是,隨之而來的是這些團體搞砸了。 這會產生堆積的圖。 有人怎么做到這一點?

用少量的預處理可以匯總按日期和F_TYPE的值以產生期望的yminlowermiddleupperymax的參數geom_boxplot (訣竅是設置stat = "identity" ):

forecasts %>% group_by(f_type, Date) %>% 
    summarise( # You can set your desired values/quantiles here
        y_min = quantile(value, 0.05),
        low = quantile(value, 0.25),
        mid = quantile(value, 0.5),
        high = quantile(value, 0.75),
        y_max = quantile(value, 0.95)
    ) %>% 
    ggplot() + 
    geom_boxplot(
        aes(
            ymin = y_min,
            lower = low,
            middle = mid,
            upper = high,
            ymax = y_max,
            x = as.factor(Date),
            fill = f_type
        ), 
        stat = "identity"
    ) + 
    geom_line(
        data = observations,
        aes(
            x = as.factor(Dt), 
            y = obs, group = 1
        ), 
        size = 2
    )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM