2011-03-02 2 views
8

Скажем, у нас есть следующий простой фрейм данных пар значений даты, где некоторые даты отсутствуют в последовательности (т. Е. С 12 по 14 января). Когда я рисую точки, он показывает эти отсутствующие даты по оси x, но нет точек, соответствующих этим датам. Я хочу, чтобы эти отсутствующие даты не отображались по оси х, так что точка-последовательность не имеет разрывов. Любые предложения о том, как это сделать? Благодаря!R + ggplot2: как скрыть отсутствующие даты от оси х?

dts <- c(as.Date(c('2011-01-10', '2011-01-11', '2011-01-15', '2011-01-16'))) 
df <- data.frame(dt = dts, val = seq_along(dts)) 
ggplot(df, aes(dt,val)) + geom_point() + 
     scale_x_date(format = '%d%b', major='days') 

enter image description here

ответ

8

Включить данные о дате в фактор времени. В настоящий момент ggplot интерпретирует данные в том смысле, в каком вы сказали, что данные находятся в непрерывной шкале дат. Вы не хотите, что масштаб, вы хотите категорический шкала:

require(ggplot2) 
dts <- as.Date(c('2011-01-10', '2011-01-11', '2011-01-15', '2011-01-16')) 
df <- data.frame(dt = dts, val = seq_along(dts)) 
ggplot(df, aes(dt,val)) + geom_point() + 
     scale_x_date(format = '%d%b', major='days') 

против

df <- data.frame(dt = factor(format(dts, format = '%d%b')), 
        val = seq_along(dts)) 
ggplot(df, aes(dt,val)) + geom_point() 

, который производит: enter image description here

Это то, что вы хотели?

+0

@Gavin, спасибо ... но что изменения даты быть отображается: у меня было 10Jan до 16Jan, теперь мы получаем 2Jan через 5Jan. Любой способ исправить это? Думаю, я мог бы рассматривать даты как строки и полностью потерять семантику даты, но есть ли способ, когда я не теряю семантику даты? –

+0

Но это последовательные даты, а не одни из исходного вопроса. –

+0

Я заметил, что забыл форматировать даты в соответствии с первоначальной шкалой. Моя ошибка - см. Ответ сейчас. –

5

Первый вопрос: почему вы хотите это сделать? Нет смысла показывать график на основе координат, если ваши оси не являются координатами. Если вы действительно хотите это сделать, вы можете преобразовать его в фактор. Будьте осторожны, для того, хотя:

dts <- c(as.Date(c('31-10-2011', '01-11-2011', '02-11-2011', 
      '05-11-2011'),format="%d-%m-%Y")) 
dtsf <- format(dts, format= '%d%b') 
df <- data.frame(dt=ordered(dtsf,levels=dtsf),val=seq_along(dts)) 
ggplot(df, aes(dt,val)) + geom_point() 

enter image description here

С факторами, вы должны быть осторожны, так как порядок произволен в фактор, если вы сделаете это упорядоченный фактор. Поскольку факторы упорядочены по алфавиту по умолчанию, вы можете столкнуться с некоторыми форматами дат. Поэтому будьте осторожны, что вы делаете. Если не принимать во внимание порядок, вы получите:

df <- data.frame(dt=factor(dtsf),val=seq_along(dts)) 
ggplot(df, aes(dt,val)) + geom_point() 

enter image description here

+0

В финансовых временных рядах довольно часто нет данных о выходных, так что визуально не приятно иметь перерывы на участках, где есть выходные. –

+0

@Прапад: Вижу. Я бы предпочел добавить что-то вроде «рабочих дней», а затем на оси X, так как теперь вы создаете впечатление непрерывной функции, которая на самом деле не непрерывна на оси X. Звучит как придирка, но это может быть довольно запутанным. –

+0

+1 хорошие моменты на факторах порядка –

7

Я сделал пакет, который делает это. Он называется bdscale, и он находится на CRAN и github. Бесстыдная вилка.

Чтобы повторить свой пример:

> library(bdscale) 
> library(ggplot2) 
> library(scales) 
> dts <- as.Date(c('2011-01-10', '2011-01-11', '2011-01-15', '2011-01-16')) 
> ggplot(df, aes(x=dt, y=val)) + geom_point() + 
    scale_x_bd(business.dates=dts, labels=date_format('%d%b')) 

replicate example

Но то, что вы, вероятно, хотите, чтобы загрузить известные действительные даты, а затем построить ваши данные, используя действительные даты на оси х:

> nyse <- bdscale::yahoo('SPY') # get valid dates from SPY prices 
> dts <- as.Date('2011-01-10') + 1:10 
> df <- data.frame(dt=dts, val=seq_along(dts)) 
> ggplot(df, aes(x=dt, y=val)) + geom_point() + 
    scale_x_bd(business.dates=nyse, labels=date_format('%d%b'), max.major.breaks=10) 

Warning message: 
Removed 3 rows containing missing values (geom_point). 

better

предупреждение говорит вам, что он снимал три даты:

  • 15 = суббота
  • шестнадцатого = воскресенье
  • семнадцатом = День MLK
+1

Просто небольшая коррекция, вы создали * пакет *, который делает это (не библиотеку) –

+1

У меня есть _package_ для вас ** прямо здесь **, приятель. Все они. Но вы правы, сэр, я поправлю. – dvmlls

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