按日期子集箱线图
Subset boxplot by date
我想根据具有 10 天数据类别的时间序列制作箱线图
set.seed(100)
date <- seq.Date(as.Date("2013-01-01"), as.Date("2014-12-31"), "days")
x <- as.integer(abs(rnorm(365))*1000)
df <- data.frame(date, x)
library(ggplot2)
ggplot(df) +
geom_boxplot(aes(y=x,
x=reorder(format(df$date,'10 days'),df$date),
fill=format(df$date,'%Y'),
group=cut(df$date, "10 days"))) +
xlab('10 Dyas') + guides(fill=guide_legend(title="Year")) +
theme_bw()
但是我得到了这样的结果
我不知道为什么我在这里得到 NA 并且 x 标签不显示日期轴,如 1 月 1 日至 10 日、1 月 11 日至 20 日等
我的脚本有问题吗?
您可以使用 scale_x_date
。
library(ggplot2)
ggplot(df) +
geom_boxplot(aes(y=x,
x=date,
fill=format(date,'%Y'))) +
xlab('Monthly data') + guides(fill=guide_legend(title="Year")) +
theme_bw() +
scale_x_date(breaks = '1 month') +
theme(axis.text.x = element_text(angle = 90, hjust = 1))
我选择 1 个月作为休息时间间隔以获得更好的可见性,但如果需要,您可以使用 "10 days"
。
我只是想帮你解决问题。我认为如果您在 ggplot
:
之前生成所需的变量,将很容易解决问题
set.seed(100)
date <- seq.Date(as.Date("2013-01-01"), as.Date("2014-12-31"), "days")
x <- as.integer(abs(rnorm(365))*1000)
df <- data.frame(date, x)
library(tidyverse)
df1<-df %>%
mutate(
x1=reorder(format(date,'10 days'),date),
fill=format(date,'%Y'),
group=cut(date, "10 days")
)
df1 %>%
ggplot(aes(y = x, x= date, fill=fill, group= group))+
geom_boxplot()
那么如果你查看你的数据df1
,你会发现当group == 2013-12-27
时,fill
有两个值:2013
和2014
。这就是为什么除了 2013
和 2014
之外还有一个 NA
组。解决方案取决于您希望如何将值分配给该组,或分组的替代方式。一个愚蠢的快速修复是
df1$fill = ifelse(as.character(df1$group) == "2013-12-27", "2013", df1$fill)
您还可以检查由 x = reorder(format(df$date,'10 days'), df$date)
(我使用 x1)生成的 x
轴只有一个值:10 days
。
我想根据具有 10 天数据类别的时间序列制作箱线图
set.seed(100)
date <- seq.Date(as.Date("2013-01-01"), as.Date("2014-12-31"), "days")
x <- as.integer(abs(rnorm(365))*1000)
df <- data.frame(date, x)
library(ggplot2)
ggplot(df) +
geom_boxplot(aes(y=x,
x=reorder(format(df$date,'10 days'),df$date),
fill=format(df$date,'%Y'),
group=cut(df$date, "10 days"))) +
xlab('10 Dyas') + guides(fill=guide_legend(title="Year")) +
theme_bw()
但是我得到了这样的结果
我不知道为什么我在这里得到 NA 并且 x 标签不显示日期轴,如 1 月 1 日至 10 日、1 月 11 日至 20 日等
我的脚本有问题吗?
您可以使用 scale_x_date
。
library(ggplot2)
ggplot(df) +
geom_boxplot(aes(y=x,
x=date,
fill=format(date,'%Y'))) +
xlab('Monthly data') + guides(fill=guide_legend(title="Year")) +
theme_bw() +
scale_x_date(breaks = '1 month') +
theme(axis.text.x = element_text(angle = 90, hjust = 1))
我选择 1 个月作为休息时间间隔以获得更好的可见性,但如果需要,您可以使用 "10 days"
。
我只是想帮你解决问题。我认为如果您在 ggplot
:
set.seed(100)
date <- seq.Date(as.Date("2013-01-01"), as.Date("2014-12-31"), "days")
x <- as.integer(abs(rnorm(365))*1000)
df <- data.frame(date, x)
library(tidyverse)
df1<-df %>%
mutate(
x1=reorder(format(date,'10 days'),date),
fill=format(date,'%Y'),
group=cut(date, "10 days")
)
df1 %>%
ggplot(aes(y = x, x= date, fill=fill, group= group))+
geom_boxplot()
那么如果你查看你的数据df1
,你会发现当group == 2013-12-27
时,fill
有两个值:2013
和2014
。这就是为什么除了 2013
和 2014
之外还有一个 NA
组。解决方案取决于您希望如何将值分配给该组,或分组的替代方式。一个愚蠢的快速修复是
df1$fill = ifelse(as.character(df1$group) == "2013-12-27", "2013", df1$fill)
您还可以检查由 x = reorder(format(df$date,'10 days'), df$date)
(我使用 x1)生成的 x
轴只有一个值:10 days
。