R + ggplot2: как скрыть пропущенные даты по оси X? - PullRequest
8 голосов
/ 02 марта 2011

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

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

Ответы [ 3 ]

11 голосов
/ 02 марта 2011

Превратите данные даты в фактор тогда. В данный момент 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

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

9 голосов
/ 28 октября 2014

Я сделал пакет , который делает это. Он называется 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

Но вам, вероятно, нужно загрузить известные действительные даты, а затем нанести на график ваши данные, используя действительные даты на оси x:

> 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 = суббота
  • 16-е = воскресенье
  • 17 = День МЛК
6 голосов
/ 02 марта 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...