Хронологическая шкала времени с точками времени и форматом даты

Я новичок в R и ggplot2, и мне было интересно, как я могу создать временную шкалу, отображающую точки в заданное время, используя R? У меня также есть проблемы со свиданиями, которые у меня есть. (Я не уверен, стоит ли публиковать это как два вопроса, но приступим).

У меня есть фрейм данных с годом и месяцем в виде символов в формате ГГГГММ, именами двух человек и событием, которое имело место.

Нравится:

> data

YearMonth   Person1   Person2    Event
200606       Alice      Bob      event1
200606       Bob        Alice    event2
200608       Alice      Bob      event3
200701       Alice      Bob      event3
200703       Bob        Alice    event2
200605       Alice      Bob      event4

Изначально даты были целыми числами, которые я преобразовал в символы с помощью as.character(). Я пытаюсь преобразовать его в форматированную дату. Я использовал as.Date() и пробовал разные способы форматирования даты. Ближе всего к этому я подошел с data$YearMonth <- as.Date(data$YearMonth,"%Y"), но это дало мне «2006-12-20» и «2007-12-20» для всех строк 2006xx и 2007xx соответственно. Есть ли способ сделать это, чтобы я получил что-то вроде «ГГГГ-ММ» или «ГГГГ / ММ»?

Я также пробовал data$YearMonth <- strptime(data$YarMonth, "%Y%m"), но это дало мне <NA> значений.

Но моя главная проблема - это сроки.

Следующее изображение - это тот формат, который мне нужен:

http://www.vertex42.com/ExcelArticles/Images/timeline/Timeline-for-Benjamin-Franklin.gif

но с осью x, показывающей месяц и год (например, 2006-06, 2006-07… 2007-06), и линиями, отходящими от оси, помеченными как Event, Person1 и Person2.

Я просмотрел пакет «временная шкала» на ?timeline, но во фрейме данных, который у меня есть, нет данных за периоды времени (даты начала и окончания). У меня просто есть момент времени (YearMonth).

Я также попробовал пример на Нарисуйте хронологическую шкалу времени с помощью ggplot2 с помощью ggplot2. Однако у меня нет дислокаций для оси y, и я хотел, чтобы линии событий выходили за пределы оси x.

Примечание. Это очень упрощенный пример, поскольку у меня есть около тысячи строк за период с июня 2006 г. по июнь 2007 г. Можно ли вообще создать временную шкалу с таким большим количеством данных?

Любая помощь горячо приветствуется. Спасибо за ваше время!


person o.o    schedule 20.12.2013    source источник


Ответы (3)


Вот еще одна попытка:

df$YM <- as.Date(paste0("01",df$YearMonth), format="%d%Y%m")
rangeYM <- range(df$YM)

plot(NA,ylim=c(-1,1),xlim=rangeYM,ann=FALSE,axes=FALSE)
abline(h=0,lwd=2,col="#5B7FA3")

ypts <- rep_len(c(-1,1), length.out=nrow(df))
txtpts <- rep_len(c(1,3), length.out=nrow(df))
segments(df$YM,0,df$YM,ypts,col="gray80")

axis.Date(
 1,
 at=seq.Date(rangeYM[1],rangeYM[2],by="month"),
 format="%Y-%m",
 cex.axis=0.6,
 pos=0,
 lwd=0,
 lwd.tick=2,
 col="#5B7FA3",
 font=2
)

points(df$YM,y=ypts, pch="-", cex=1.5, col="#5B7FA3")
par(xpd=NA)
text(
  df$YM, y=ypts,
  labels=paste(df$Person1,df$Person2,df$Event,sep="\n"), cex=0.7, pos=txtpts
)
par(xpd=FALSE)

введите описание изображения здесь

person thelatemail    schedule 20.12.2013
comment
Большое спасибо @thelatemail. За исключением нескольких проблем с объемом данных, которые у меня были, он работал отлично! :) - person o.o; 23.12.2013
comment
@thelatemail в axis.Date pos позиционирует значения даты на горизонтальной линии. Есть ли возможность сделать это в ggplot2? Нет возможности для позиции в scale_x_date. пожалуйста помоги - person mockash; 28.12.2016
comment
Вы знаете, как сделать это с более чем 2 мероприятиями в день? Я разместил здесь вопрос, основанный на вашем примере: stackoverflow.com/questions/43529103/ - person nak5120; 20.04.2017
comment
Ошибка в plot.window (...): нужны конечные значения 'xlim'. Вызовы: Неограниченное количество eval - ›plot -› plot.default - ›localWindow -› plot.window - person Europa; 29.05.2021
comment
@europa - у вас, вероятно, есть NA в значениях оси x. Попробуйте диапазон (df $ YM, na.rm = TRUE). - person thelatemail; 29.05.2021

Почему не это:


>YearMonth = c(200506,200509) 

>dt = as.POSIXct(strptime(paste0(YearMonth, 15), "%Y%m%d"))
>z = rep(0, length(dt))
>y = rep(c(-1,1), out=length(dt))
>plot(dt,y, axes=FALSE, ylab="", xlim=c(min(dt)-10e6, max(dt)+10e6), ylim=c(-2,2), pch=15, col="darkblue", xlab="Date")
>arrows(x0=dt,y0= z, x1=dt, y1=y, length=0, angle=30, col="blue")
>arrows(min(dt), 0, max(dt), length=0, col="blue")
>text(dt, y*1.5, c("Ben Franklin arose\nfrom the dead", "Atlantis found"), adj=1)
>axis.POSIXct(1, dt, format="%y/%m")
>dt
[1] "2005-06-15 EDT" "2005-09-15 EDT"

введите описание изображения здесь

person alex keil    schedule 20.12.2013
comment
Спасибо за ваш ответ. Это дает мне день, а не только год и месяц. Думаю, я мог бы просто использовать это, но мне интересно, может ли это вызвать проблемы при создании временной шкалы. Я хотел посмотреть, могу ли я использовать даты из моего фрейма данных в качестве дат для оси. - person o.o; 20.12.2013
comment
@ o.o - все, что сделал Алекс, это выбрал среднюю точку для каждого месяца / года. Любой график комбинации месяца / года будет иметь номинальный день, связанный с ним, будь то первый, последний, средний или другой день. - person thelatemail; 20.12.2013
comment
Я изменил даты на оси - они действительно выглядели так, как будто они включали день. Добавление дня - это всего лишь уловка, позволяющая заставить работать функцию даты POSIXct, которая упрощает построение графиков. Вы должны иметь возможность применять мою функцию даты непосредственно к фрейму данных, чтобы ваши даты работали. - person alex keil; 20.12.2013
comment
Другой вариант - преобразовать даты в десятичные числа - это будет работать лучше, если вы не будете беспокоиться о месяцах на графике. - person alex keil; 20.12.2013
comment
Спасибо за вашу помощь :) - person o.o; 23.12.2013

С некоторыми небольшими изменениями в ответе @thelatemail вы можете точно настроить ось для печати индикатора для дат событий, а также управлять перекрытием событий, которые происходят в одну и ту же дату ... или управлять перекрытием, возникающим из-за количества данных, которые у вас есть в вашем df ..

df$YM <- as.Date(paste0("01",df$YearMonth), format="%d%Y%m")
rangeYM <- range(df$YM)
plot(NA,ylim=c(-1,1),xlim=rangeYM,ann=FALSE,axes=FALSE)
abline(h=0,lwd=2,col="#5B7FA3")
ypts <- rep(c(-1,-0.5,0.5,1), length.out=nrow(df))
txtpts <- rep(c(1,3), length.out=nrow(df))
segments(df$YM,0,df$YM,ypts,col="gray80")
axis.Date( 1,at=seq.Date(rangeYM[1],rangeYM[2],by="days"),
format="%Y-%m",
cex.axis=0.6, pos=0, lwd=0, lwd.tick=2, col="#5B7FA3", font=2)
points(df$YM,y=ypts, pch="-", cex=1.5, col="#5B7FA3")
par(xpd=NA)
text( df$YM, y=ypts,labels=paste(df$Person1,df$Person2,df$Event,sep="\n"),cex=0.7, pos=txtpts)
par(xpd=FALSE)
person Vijayan    schedule 25.05.2016