Как мне увеличить ось X, когда это дата? - PullRequest
3 голосов
/ 20 апреля 2011

Я планирую версию программного обеспечения до даты ее выпуска.Пример:

test.cvs

Version,Date
0.302,23/2/2011
0.301,26/1/2011
0.215,28/4/2010
0.106,19/12/2008
0.069,21/3/2008

Для построения графика я использую:

tbl <- read.csv("test.csv")
dates <-strptime(as.character(tbl$Date), "%d/%m/%Y")
plot(dates,tbl$Version,type="o",main="Releases", xlab="Date",ylab="Version")

хотя я бы предпочел, чтобы график строился по месяцам / годам, а этикетки были напечатаны вертикально.Как я мог сделать это?Я попытался установить xaxt = "n" и использовать функцию axis () с меткой = format (data, fmt), но у меня все равно не получается.

вывод фрагмента данных:

structure(list(Version = c(0.302, 0.301, 0.215, 0.106, 0.069), 
    Date = structure(c(3L, 4L, 5L, 1L, 2L), .Label = c("19/12/2008", 
    "21/3/2008", "23/2/2011", "26/1/2011", "28/4/2010"), class = "factor")), .Names = c("Version", 
"Date"), class = "data.frame", row.names = c(NA, -5L))

Ответы [ 3 ]

4 голосов
/ 20 апреля 2011

Вот базовая графическая версия. Во-первых, проще манипулировать столбцом Date на месте, чем создавать дополнительный dates объект:

tbl <- within(tbl, Date <- as.Date(Date, "%d/%m/%Y"))

Это делает сюжет. Обратите внимание, что нам нужно немного больше места в нижней части для размещения меток даты:

op <- par(mar = c(6,4,4,2) + 0.1) ## larger bottom margin
## plot data but suppress axes and annotation
plot(Version ~ Date, data = tbl, type = "o", axes = FALSE, ann = FALSE)
## Use Axis to plot the Date axis, in 1 month increments
## format the sequence of dates `ds` as abbreviated month name and Year
with(tbl, Axis(Date, at = (ds <- seq(min(Date), max(Date), by = "months")),
               side = 1, labels = format(ds, format = "%b %Y"), las = 2))
## Add y-axis and plot frame
axis(2)
box()
## add on the axis labels
title(ylab = "Version", main = "Releases")
title(xlab = "Date", line = 5) ## pushing the x-axis label down a bit
par(op) ## reset the pars

Это дает нам:

plot with custom Date axis

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

with(tbl, Axis(Date, at = (ds <- seq(min(Date), max(Date), by = "2 months")),
               side = 1, labels = format(ds, format = "%b %y"), las = 2))

Чтобы использовать это, просто замените приведенный выше вызов вместо существующего оператора with(....).

2 голосов
/ 20 апреля 2011

Создайте последовательность дат для меток осей.

start <- as.Date("01/01/2008", "%d/%m/%Y")
end <- as.Date("01/12/2011", "%d/%m/%Y")
x_breaks <- seq(start, end, by = "month")

Создайте dates как Date в соответствии с вышеуказанной последовательностью.

dates <- as.Date(as.character(tbl$Date), "%d/%m/%Y")

Установите некоторые графические параметры, las = 3 вращает вашу ось X;mar изменяет ширину полей.

par(las = 3, mar = c(7, 5, 3, 1))

Теперь нарисуйте его и вручную добавьте ось x, как вы предлагали.

plot(dates,tbl$Version,type="o",main="Releases", xlab="", ylab="Version", xaxt = "n")
axis(side = 1, at = as.numeric(x_breaks), labels = strftime(x_breaks, "%b %Y"))
title(xlab = "Date", line = 5)
1 голос
/ 20 апреля 2011

Вы можете легко сделать это, используя ggplot2. Вот код

# generate data frame
df = data.frame(
       Version = rnorm(20),
       Date    = seq(as.Date('2010-01-01'), by = '1 month', length = 20)
     )

# create plot
p0 = qplot(Date, Version, data = df) +
     scale_x_date(major = '1 month') +
     opts(axis.text.x = theme_text(angle = 90))

Вот вывод

enter image description here

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