2017-01-05 4 views
1

Мои данные принимают структуру:Как наложить метки оси в ggplot?

month <- c("May", "June", "July", "May", "June", "July") 
year <- c("2015", "2015", "2015", "2016", "2016", "2016") 
value <- c(1:3, 3:1) 
df <- data.frame(month, year, value) 

(данные на самом деле пройти весь путь с января по декабрь в течение двух лет, это всего лишь короткий воспроизводимый пример.)

Я делаю график временных рядов value с использованием ggplot (предположим, что я не могу использовать plot.ts() по причинам, которые слишком сложны для объяснения здесь). Как слой метки на оси х, так что каждая галочка метят месяца, но ниже, что есть еще одна метка ниже, с года, так что я получаю что-то вроде:

-------+-------+-------+----//---+-------+-------+----- 
     May  June July  May  June July 
       2015      2016 
+1

Вы можете взглянуть на http://stackoverflow.com/questions/20571306/multi-row-x-axis-labels-in-ggplot-line-chart и http://stackoverflow.com/questions/ 18165863/multirow-axis-labels-with-inested-grouping-variables (я не думаю, что они дубликаты). – Uwe

+0

Спасибо! Это именно то, что я ищу. Я сделал поиск, но он не принес эти статьи. – mmyoung77

+0

BTW: Я предпочитаю стандартное обозначение ISO8601 месяцев 2015-05, 2015-06, 2015-07, 2016-05 и т. Д. Это гарантирует, что месяцы сортируются в правильном порядке при преобразовании в коэффициент. – Uwe

ответ

4

I будет делать не две оси, а только одну, с отрегулированными метками с разрывом линии в них. В этом примере показано, как добавить год ниже каждого месяца. Я привык ставить год ниже января, если januari не существует в первый месяц месяца. Вы можете настроить подготовку этикетки по своему вкусу.

df$lab <- factor(1:6, labels = paste0(month,"\n",year)) 
ggplot(df, aes(x = lab, y = value)) + geom_point() 

enter image description here

+0

Очень умное использование параметра 'label' функции' factor() ', которая обеспечивает выполнение заданного порядка сортировки. Просто использование 'paste()' без этого приведет к алфавитному порядку лейблов June 2015, June 2016, July 2015 и т. Д., Тем самым игнорируя годы как первичные критерии сортировки. – Uwe

2

Другой вариант заключается в использовании огранку в год и поставить фасетов метки ниже оси Х этикетки. Это упрощает проведение одного года в год. Я удалил пространство между панелями, чтобы создать внешний вид незапланированного сюжета, но добавил вертикальную линию между годами, чтобы выделить разрыв во времени. Если вы предпочитаете отдельные панели, то просто удалите элементы panel.spacing и panel.bordertheme.

theme_set(theme_classic()) 

df$month = factor(df$month, levels=month.name) 

ggplot(df, aes(x = month, y = value)) + 
    geom_point() + 
    facet_grid(. ~ year, switch="x") + 
    theme(strip.placement="outside", 
     strip.background=element_rect(colour=NA), 
     panel.spacing.x=unit(0,"lines"), 
     panel.border=element_rect(colour="grey50", fill=NA)) 

enter image description here

В зависимости от вашего случая использования, вы можете обнаружить, что предпочтительнее использовать цветовую эстетику для каждого года и поставить все линии на одной панели:

ggplot(df, aes(x = month, y = value, colour=year, group=year)) + 
    geom_line() + geom_point() 

enter image description here

Смежные вопросы