geom_boxplot 中不显示垂直线

Posted

技术标签:

【中文标题】geom_boxplot 中不显示垂直线【英文标题】:Vertical line does not show in geom_boxplot 【发布时间】:2021-12-19 08:47:26 【问题描述】:

我有一个如下所示的数据框(例如):

set.seed(42)  ## for sake of reproducibility
n <- 6
dat <- data.frame(date=seq.Date(as.Date("2020-12-26"), as.Date("2020-12-31"), "day"),
                  category=rep(LETTERS[1:2], n/2),
                  daily_count=sample(18:100, n, replace=TRUE)
                  )
dat
#         date    category  daily_count
#1  2020-12-26        A          60
#2  2020-12-27        B          32
#3  2020-12-28        B          39
#4  2020-12-29        B          75
#5  2020-12-30        A          25
#6  2020-12-31        A          53
#7  2020-12-26        A          60
#8  2020-12-27        A          32
#9  2020-12-28        A          39
#10 2020-12-29        B          75
#11 2020-12-30        B          25
#12 2020-12-31        B          53
.
.
.

我正在尝试在其 X 轴上创建一个带有月份和年份的箱线图,它看起来像这样:

我想在 2013-08-23 上创建一条垂直线。我为此使用以下代码:

library(ggplot2)

ggplot(dat) +
  geom_boxplot(aes(y=daily_count,
                   x=reorder(format(dat$date,'%b %y'),dat$date),
                   fill=dat$category)) +
  xlab('Month & Year') + ylab('Count') + guides(fill=guide_legend(title="Category")) +
  theme_bw()+
  theme(axis.text=element_text(size=10),
         axis.title=element_text(size=10))+
  geom_vline(xintercept = as.numeric(as.Date("2013-08-23")), linetype=1, colour="red")

请问有什么指导吗?

【问题讨论】:

问题是2013-08-23 位于 x 轴上的日期范围之外,因此不会显示。 @neilfws 感谢您的评论。你会建议什么解决方案?因为我想在 2013 年 8 月划清界限。 您的要求不明确。这是我的疑问:您的可重现示例不包含您请求的日期:由于您正在按 MONTH 创建箱线图,如何在 DAY 上显示垂直线?您能否澄清您的意见和预期结果? @Edo,对此我深表歉意。是的,我想按月显示我的箱线图,我想在 2013 年 8 月插入该行。我的 MWE 只是展示我所拥有的那种的一个例子。实际数据介于 2012 年 8 月至 2014 年 8 月之间。 【参考方案1】:

我认为没有必要进行任何“扩展”...这不是我的解决方案,而是@dario 修改后的解决方案。我认为问题出在美学上。

ggplot(dat, aes(y=daily_count,
                x=date,
                fill=category)) +
  geom_boxplot() +
  labs(x = 'Month & Year', ylab= 'Count', fill = "Category") + 
  theme_bw()+
  theme(axis.text=element_text(size=10),
        axis.title=element_text(size=10))+
  geom_vline(xintercept = as.Date("2020-12-28"), linetype=1, colour="red")

【讨论】:

【参考方案2】:

在这个答案中:

我创建了一个更大的样本 为了简单起见,我使用来自tsibbleyearmonth 我已经解决了垂直线的问题 我清理了一些使用实验室以获得更简洁的代码
set.seed(42)
dates <- seq.Date(as.Date("2012-08-01"), as.Date("2014-08-30"), "day")
n <- length(dates)
dat <- data.frame(date = dates,
                  category = rep(LETTERS[1:2], n/2),
                  daily_count = sample(18:100, n, replace=TRUE))

library(ggplot2)
library(tsibble)

ggplot(dat) +
  geom_boxplot(aes(y = daily_count,
                   x = yearmonth(date),
                   group = paste(yearmonth(date), category),
                   fill = category)) +
  labs(x = 'Month & Year',
       y = 'Count',
       fill = "Category") +
  theme_bw() +
  theme(axis.text=element_text(size=10),
        axis.title=element_text(size=10)) +
  geom_vline(xintercept =  lubridate::ymd("2013-08-23"), linetype=1, colour="red", size = 2)

由reprex package (v2.0.0) 于 2021-11-05 创建

我将垂直线设置得更粗以便被看到。


不幸的是,图表很难可视化。你为什么不用丝带代替呢? 随机数据是可怕的,但你应该看到一些有意义的东西。


library(ggplot2)
library(tsibble)
library(dplyr)
library(tidyr)

dat %>% 
  group_by(category, yearmonth = yearmonth(date)) %>% 
  summarise(q = list(quantile(daily_count))) %>% 
  unnest_wider(q, names_sep = "_") %>% 
  
  ggplot(aes(x = yearmonth, fill = category, colour = category)) + 
  geom_ribbon(aes(ymin = `q_0%`, ymax = `q_100%`), alpha = 0.2) +
  geom_ribbon(aes(ymin = `q_25%`, ymax = `q_75%`), alpha = 0.2) +
  geom_line(aes(y = `q_50%`)) +
  labs(x = 'Month & Year',
       y = 'Count',
       colour = "Category",
       fill = "Category") +
  theme_bw() +
  theme(axis.text=element_text(size=10),
        axis.title=element_text(size=10)) +
  geom_vline(xintercept = lubridate::ymd("2013-08-23"), linetype=1, colour="red", size = 2)

【讨论】:

请再问一个问题。如何在 x 轴上显示所有月份及其对应年份? 只需添加+ scale_x_yearmonth(date_breaks = "month")

以上是关于geom_boxplot 中不显示垂直线的主要内容,如果未能解决你的问题,请参考以下文章

R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(配置数据点显示)实战

CSS3 垂直弹出菜单 + 过渡在 FF 中不起作用

滚动条在 jquery 移动应用程序中不可见

显示:阻止在 Chrome 或 Safari 中不起作用

css表格单元格和垂直对齐中间在Firefox中不起作用

ggplot2 函数中 geom_boxplot 的平均值和中值箱线图图例