Переменная длина отметок оси в редакторе ggplot: основные и второстепенные отметки
Я создаю график, показывающий доступные данные для экспериментальных установок с использованием ggplot. Моя проблема в том, что ось Y становится слишком тесной, поэтому я бы хотел, чтобы все остальные метки были длиннее, что позволило бы использовать больший шрифт для меток оси.
Моя цель состоит в том, чтобы построить график числа полевых установок в зависимости от возраста при измерении, показать все доступные данные и отсортировать их по возрасту при первом измерении. Вот пример использования псевдоданных. Обратите внимание, что порядок построения установок на оси Y зависит от возраста при первом измерении.
# create data frame of fake values
set.seed(1)
plots <- data.frame(installation=rep(sample(seq(1,100,1), 10), each=10),
age=as.vector(replicate(10, sample(seq(1,50,1), 10))))
# set up installations as factor, sorted by age at first measurement
odr <- ddply(plots, .(installation), summarize, youngest = min(age))
odr <- odr[order(odr$youngest),]
plots$installation <- factor(plots$installation, levels=rev(as.numeric(as.character(odr$installation))))
rm(odr)
# plot the available data
ggplot(plots, aes(installation, age)) +
geom_point() +
coord_flip()
На самом деле у меня есть около 60 инсталляций и лейбл для каждой, так что становится тесно. Смещая все остальные отметки оси Y немного дольше, я могу использовать больший шрифт для надписей. Это вопрос, на который я надеюсь получить ответ.
Я попытался построить четные и нечетные факторы по отдельности, что позволило бы мне поиграть с метками осей для каждого, но порядок упал, и я не уверен, почему. Если есть способ получить эффект тика оси, я по другому, я не женат на этом подходе.
# break up the data frame into odd and even factors
odds <- plots[as.numeric(plots$installation) %% 2 != 0,]
evens <- plots[as.numeric(plots$installation) %% 2 == 0,]
# try and plot odds and evens seperately
ggplot(odds, aes(installation, age)) +
geom_point() +
coord_flip() +
geom_point(data = evens, aes(installation, age))
Спасибо!
2 ответа
Хорошо, понял это с помощью jhoward выше и с этим вопросом.
Хитрость заключается в том, чтобы наметить второстепенные отметки на исходном графике, а затем добавить основные отметки, используя annotation_custom.
Используя набор данных сверху:
# base plot
base <- ggplot(plots, aes(age,installation)) +
geom_point() +
scale_y_discrete(breaks=levels(plots$installation)[c(2,4,6,8,10)]) +
scale_x_continuous(expand=c(0,1)) +
theme(axis.text=element_text(size=10),
axis.title.y=element_text(vjust=0.1))
# add the tick marks at every other facet level
for (i in 1:length(plots$installation)) {
if(as.numeric(plots$installation[i]) %% 2 != 0) {
base = base + annotation_custom(grob = linesGrob(gp=gpar(col= "dark grey")),
ymin = as.numeric(plots$installation[i]),
ymax = as.numeric(plots$installation[i]),
xmin = -1.5,
xmax = 0)
}
}
# add the labels at every other facet level
for (i in 1:length(plots$installation)) {
if(as.numeric(plots$installation[i]) %% 2 != 0) {
base = base + annotation_custom(grob = textGrob(label = plots$installation[i],
gp=gpar(col= "dark grey", fontsize=10)),
ymin = as.numeric(plots$installation[i]),
ymax = as.numeric(plots$installation[i]),
xmin = -2.5,
xmax = -2.5)
}
}
# create the plot
gt <- ggplot_gtable(ggplot_build(base))
gt$layout$clip[gt$layout$name=="panel"] <- "off"
grid.draw(gt)
Нечто подобное помечало бы каждую другую галочку:
ggplot(plots, aes(age,installation))+
geom_point()+
scale_y_discrete(breaks=levels(plots$installation)[c(2,4,6,8,10)])
Это работает в общем случае:
lvls <- levels(plots$installation)
brks <- 2*(1:(length(lvls)/2))
ggplot(plots, aes(age,installation))+
geom_point()+
scale_y_discrete(breaks=levels(plots$installation)[brks])