R / Zoo: показывать галочку каждый год по оси X - PullRequest
4 голосов
/ 23 января 2012

У меня есть объект зоопарка с индексом yearqtr, охватывающий около 50 лет. При построении графика ось X показывает метки каждые 10 лет, что выглядит немного бесплодно:

b=zoo(1:200,as.yearqtr(1900+seq(1,200)/4))
plot(b)

Некоторые исследования дали мне это:

plot(b,xaxt="n");axis(1,time(b))

Это похоже на колебание от одного крайнего положения к другому, поскольку ось x представляет собой размытые отметки с уродливыми дробными метками. Есть ли простой способ показать это годами? (Первоначально я искал способ сказать: «немного уменьшить интервал надписей по оси x», но ничего подобного нет? Cex.axis просто изменяет размер шрифта.)

Ответы [ 2 ]

4 голосов
/ 23 января 2012

Вы читали help(axis)?

Вот один из способов, просто создать простой индекс каждые четыре квартала:

R> ind <- seq(1, length(b), by=4)

и использовать его для индексации оси размещения и метки :

R> plot(b,xaxt="n")
R> axis(1,time(b)[ind], format(time(b)[ind]), las=2, cex.axis=0.5)

enter image description here

Я использовал las=2 и нижнее значение cex, чтобы сделать это подгонкой.Один раз в год все еще может быть слишком много.

Очень сложно вычислить "хорошие" метки оси.

1 голос
/ 24 января 2012

Это, вероятно, одна из тех (редких) ситуаций, когда вы хотите использовать сетку, а не галочки, чтобы лучше показать ваши данные. Как отметил @ dirk-eddelbuettel, настроить хорошие метки оси сложно, особенно с такой плотностью. Вы также можете захотеть, чтобы ваши метки были внутри графика, поэтому сетка будет немного скрывать их плотность. Самая простая сетка, которую можно получить - с abline, если только вы не хотите играть с ggplot2, но она хуже, чем стандартные графики в R (личное мнение). Также - сделайте сюжет шире. На самом деле, лучше избавиться от рамки вокруг сюжета;) Ниже приведен мод подхода Дирка:

png("strangeplot.png",width=800)
#extend y-axis to fit inside labels and remove box
plot(b,type="n",xaxt="n",yaxt="n",ylab="",xlab="",ylim=c(min(b)-30,max(b)),bty="n"))
#use 'mpg' to get labels inside
axis(1,time(b)[ind], format(time(b)[ind]), las=2, cex.axis=0.6,tick=F,mgp=c(0,-2.5,0))
axis(2,tick=F,las=1)
#you locate lines slightly to the left of label...
abline(h=seq(0,200,by=50),v=time(b)[ind]-0.5,col=gray(0.9))
#...so you need to add extra single line in the end 
abline(v=max(time(b)[ind])+0.5,col=gray(0.9))
#plot at the end to get it above grid
points(b,type="l")
dev.off() 

enter image description here

...