#r #ggplot2
Вопрос:
У меня есть диаграммы данных с одним набором диаграмм для каждого месяца. Но вместе они заняты, и неясно, какая коробка идет с какой датой. Есть ли способ оттенить каждый второй вертикальный месяц светло-серым, чтобы я мог легко видеть, какие из них подходят к какому месяцу?
Редактировать: Я уже использую geom_polygon для другой части сюжета, которую я сейчас прокомментировал.
date <- seq(as.Date('2015-09-15'), as.Date('2016-09-30'), by = "2 days")
x <- rnorm(length(date))
date <- date[order(x)]
Date <- format(as.Date(date), "%Y-%m")
values <- rnorm(length(x),.16,.01)
type <- c(rep("a",63),rep("b",64),rep("c",64))
new.table <- as.data.frame.matrix(table(Date,type))
dataset <- data.frame(values,date,type,Date)
if(length(which(levels(factor(type))=="c"))==0){
count.data <- rep(0,length(levels(factor(Date))))
}else{count.data <- new.table[,names(new.table)=="c"]}
ly <- length(count.data)
max.count <- max(count.data)
max.right <- max.count*4
max.box <- max(dataset$values,na.rm=T)
min.box <- 5/4*min(dataset$values,na.rm=T)-max.box/4
box.25 <- (max.box-min.box)/4
x <- c(0:(ly 1),c((ly 1):0))
y <- c(0,count.data,rep(0,(ly 3)))*(box.25/max.count) min.box
poly.data <- data.frame(x,y)
dates1 <- levels(factor(dataset$Date))
noB <- length(dates1)
new.table$Date <- rownames(new.table)
library(tidyverse)
library(gridExtra)
library(ggthemes)
library(ggplot2)
p <- ggplot(dataset,aes(x=Date,y=values,fill=type))
geom_boxplot(position=position_dodge(width = 0.7))
stat_boxplot(geom="errorbar",width=0.7)
coord_cartesian(ylim = c(min.box,max.box))
#geom_polygon(data=poly.data,mapping = aes(x=x,y=y),fill="grey30")
#scale_y_continuous(sec.axis = sec_axis(~(.-min.box)*max.count/box.25, name = "Sec axis"),breaks = scales::pretty_breaks(n = 10))
labs(title="Boxplot of values Over Time",y="values",x="Date (year-month)")
theme_classic(base_size=15)
theme(axis.text.x = element_text(angle = ifelse(noB>15,45,0), hjust=ifelse(noB>15,1,0.5)),panel.grid.major=element_line("light grey"))
p
Ответ №1:
Я бы использовал geom_rect
с отдельным фреймом data.frame (здесь: shades
)
shades <- data.frame(xmin=seq(1.5,length(unique(dataset$Date))-1.5, 2),
xmax=seq(2.5,length(unique(dataset$Date)) .5, 2),
ymin=0, ymax=Inf)
ggplot(dataset,aes(x=Date,y=values,fill=type))
geom_boxplot(position=position_dodge(width = 0.7))
stat_boxplot(geom="errorbar",width=0.7)
coord_cartesian(ylim = c(min.box,max.box))
#geom_polygon(data=poly.data,mapping = aes(x=x,y=y),fill="grey30")
#scale_y_continuous(sec.axis = sec_axis(~(.-min.box)*max.count/box.25, name = "Sec axis"),breaks = scales::pretty_breaks(n = 10))
labs(title="Boxplot of values Over Time",y="values",x="Date (year-month)")
theme_classic(base_size=15)
theme(axis.text.x = element_text(angle = ifelse(noB>15,45,0), hjust=ifelse(noB>15,1,0.5)),panel.grid.major=element_line("light grey"))
geom_rect(inherit.aes = F, data = shades, mapping = aes(xmin=xmin, xmax=xmax, ymin = ymin, ymax = ymax), alpha = 0.2)
Комментарии:
1. Спасибо, это здорово. Я только что внес небольшое изменение, чтобы учесть разное количество дат (при четном числе часть «оттенки» не работает.
2. Как насчет удаления только вертикальных линий внутри графика, но не отметок по оси x? Возможно ли это? Я попробовал «scale_x_continuous(разрывы = NULL)», но это не сработало.
3. Чтобы удалить вертикальные линии, используйте
panel.grid.major.y
вместоpanel.grid.major
в своем коде.4. Эта
shades
часть в основном отображает прямоугольник вокруг каждой другой группы квадратов. Не уверен, что вы сейчас отображаете, но вы должны иметь возможность корректировать позиции в зависимости от того, сколько тиков на оси даты у вас есть (дата категориальнаdataset
).5. Выходные данные части «оттенки» различаются по длине для xmin, а xmax-это длина уникальных дат четного числа, что приводит к ошибке. Поэтому я использовал функцию потолка, чтобы исправить это. Поэтому, если есть четное количество дат, то последняя колонка на графике будет серой, в противном случае она будет белой. Эта рекомендация по панельной сетке также сработала.