2012-01-23 3 views
4

У меня есть объект зоопарка с индексом yearqtr, охватывающим около 50 лет. Когда график ось абсцисс показывает метки через каждые 10 лет, что чувствует себя немного бесплодной:R/Zoo: показывать галочку каждый год по оси x

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 просто изменяет размер шрифта.)

ответ

4

Вы читали 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 Значение, чтобы это соответствовало. Один раз в год может быть слишком много.

Вычисление «хороших» меток оси действительно сложно.

+0

Благодаря @Dirk Я прочитал страницу помощи, и это было довольно запутанным. Но я ожидал/надеялся, что есть что-то более простое, чем этот правильный ответ. Это выглядит довольно низкоуровневым. (Вычисление ярлыков с хорошей осью сложно, но не невозможно, поэтому я удивлен, что никто в проекте R еще не справился с этим.) –

+0

Конечно, это было решено, см. Код для различных функций оси() различных сюжетные методы. Но это не отменяет того факта, что это все еще сложно. Теперь, для одной задачи, как это, использование базовой оси(), как я показал, все еще возможно. –

1

Это, вероятно, одна из тех (редких) ситуаций, когда вы хотите использовать сетку, а не тики, чтобы лучше показывать свои данные. Как отметил @ 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

+0

Спасибо @GeekOnAcid Мой первый вопрос: почему бы не использовать grid(), на который я ответил сам (он хорошо работает только с метками оси по умолчанию). Но неясно, какие данные указывают на метку: между линиями или одной из строк слева или справа? –

+0

@ DarrenCook В этих точках даты решения находятся между строками, но вы можете переместить их и определить вертикальные полосы в 'abline', чтобы они начинались над метками. –

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