2013-05-27 4 views
3

Я создал фигуру из двух графиков (два года) климатических данных (темп и осадок), которая выглядит точно так, как я хочу, за исключением того, что у одной из моих осей слишком много отметки. Со всем, что у меня происходит с этой цифрой, я не могу найти способ указать меньшее количество меток без испортить другие части. Я также хотел бы указать, где находятся отметки. Вот цифра: ClimateИзмените количество меток на рисунке в R

Вы можете видеть, что отметки для верхней оси просто размываются вместе, и выбранные вами цифры не очень значимы для меня. Как я могу сказать R, что я действительно хочу?

Вот данные, которые я использую: cobs10 и cobs11.

И вот мой код:

par(mfrow=c(2,1)) 
par(mar = c(5,4,4,4) + 0.3) 
plot(cobs10$day, cobs10$temp, type="l", col="red", yaxt="n", xlab="", ylab="",  
ylim=c(-25, 30)) 

axis(side=3, col="black", at=cobs10$day, labels=cobs10$gdd) 
at = axTicks(3) 
mtext("Thermal Units", side=3, las=0, line = 3) 

axis(side=2, col='red', labels=FALSE) 
at= axTicks(2) 
mtext(side=2, text= at, at = at, col = "red", line = 1, las=0) 
mtext("Temperature (C)", side=2, las=0, line=3) 

par(new=TRUE) 
plot(cobs10$gdd, cobs10$precip, type="h", col="blue", yaxt="n", xaxt="n", ylab="",  
xlab="") 
axis(side=4, col='blue', labels=FALSE) 
at = axTicks(4) 
mtext(side = 4, text = at, at = at, col = "blue", line = 1,las=0) 
mtext("Precipitation (cm)", side=4, las=0, line = 3) 


par(mar = c(5,4,4,4) + 0.3) 
plot(cobs11$day, cobs11$temp, type="l", col="red", yaxt="n", xlab="Day of Year",  
ylab="", ylim=c(-25, 30)) 

axis(side=3, col="black", at=cobs11$day, labels=cobs11$gdd) 
at = axTicks(3) 
mtext("", side=3, las=0, line = 3) 

axis(side=2, col='red', labels=FALSE) 
at= axTicks(2) 
mtext(side=2, text= at, at = at, col = "red", line = 1, las=0) 
mtext("Temperature (C)", side=2, las=0, line=3) 

par(new=TRUE) 
plot(cobs11$gdd, cobs11$precip, type="h", col="blue", yaxt="n", xaxt="n", ylab="",  
xlab="", ylim=c(0,12)) 
axis(side=4, col='blue', labels=FALSE) 
at = axTicks(4) 
mtext(side = 4, text = at, at = at, col = "blue", line = 1,las=0) 
mtext("Precipitation (cm)", side=4, las=0, line = 3) 

Спасибо за думать об этом.

ответ

6

Вы в значительной степени получили решение уже:

axis(side=3, col="black", at=cobs10$day, labels=cobs10$gdd) 

Кроме этого, вы просите, чтобы иметь тиков и этикетки на каждой записи. Посмотрите на функцию pretty:

at <- pretty(cobs10$day) 
at 
# [1] 0 100 200 300 400 

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

lbl <- which(cobs10$day %in% at) 
lbl 
# [1] 100 200 300 
lbl <- c(0, cobs10$gdd[lbl] 

axis(side=3, at=at[-5], labels=lbl) 

Update

Я был немного раздражен вашим использованием трех различных серий в одном участке. Есть много причин, по которым это хлопотно.

  1. Имея два у-значения всегда хлопотно эту статью из Stephen Few (перейти на страницу 5 мой любимый пример); в вашем случае это не так серьезно из-за характера сюжетов и использования вами цветов, чтобы указать, к какой оси y относятся значения. Но все же, в принципе.
  2. Осевые тики должны иметь фиксированную функцию, например. линейный или логарифм. С вашими тепловыми единицами они появляются «случайно» (я знаю, что это не так, но для аутсайдера они делают).
  3. Мы должны что-то сделать с вашими тиками x-axis, которые относятся только к «дню года».

Прежде всего, мы рассмотрим ваши данные и посмотрим, что можно сделать наивно. Мы признаем, что ваша переменная 'date' 'является фактической датой. Давайте использовать его и сделать R осведомленным об этом!

cobs10 <- read.table('cobs10.txt',as.is=TRUE) 
cobs10$date <- as.Date(cobs10$date) 
plot(temp ~ date, data=cobs10, type='l') 

R's builtin plotting of a formula

Здесь, мне очень нравится клещами х-оси и были некоторые проблемы тиражирование его. «хорошенький» на датах настаивал либо на 4 тика, либо на 12 тиках. Но мы вернемся к этому позже.

Далее мы можем что-то сделать с наложением.Здесь я использую '' par (mfrow = c (3,1)) '', чтобы указать R иметь три множественных графика, уложенных в одно окно; с этими множественными графиками мы можем различать внутренние и внешние поля. Аргументы '' mar '' и 'oma' 'относятся к внутренним и внешним маржи.

Включает все три переменные вместе!

par(mfrow=c(3,1), mar=c(0.6, 5.1, 0, 0.6), oma=c(5.1, 0, 1, 0)) 
plot(temp ~ date, data=cobs10, type='l', ylab='Temperatur (C)') 
plot(precip ~ date, data=cobs10, type='l', ylab='Precipitation (cm)') 
plot(gdd ~ date, data=cobs10, type='l', ylab='Thermal units') 

enter image description here

Это выглядит хорошо, но не с клещами на вершине участков. Нехорошо. Естественно, мы можем включить тики в первых двух графиках (с '' plot (..., xaxt = 'n') ''), но это исказит нижний график. Поэтому вам нужно будет сделать это для всех трех графиков, а затем добавить ось в внешний участок графика.

par(mfrow=c(3,1), mar=c(0.6, 5.1, 0, 0.6), oma=c(5.1, 0, 1, 0)) 
plot(temp ~ date, data=cobs10, type='l', xaxt='n', ylab='Temperatur (C)') 
plot(precip ~ date, data=cobs10, type='l', xaxt='n', ylab='Precipitation (cm)') 
plot(gdd ~ date, data=cobs10, type='l', xaxt='n', ylab='Thermal units') 

ticks <- seq(from=min(cobs10$date), by='2 months', length=7) 
lbl <- strftime(ticks, '%b') 
axis(side=1, outer=TRUE, at=ticks, labels=lbl) 
mtext('2010', side=1, outer=TRUE, line=3, cex=0.67) 

enter image description here

С «» довольно «» не ведет себя, как мы хотим, чтобы мы используем «» Последовательность «», чтобы сделать последовательность оси х клещей. Затем мы отформатируем даты, чтобы просто отобразить аббревиатуру названия месяца, но это делается с учетом местных настроек (я живу в Дании), см. «Locale». Чтобы добавить метки оси и метку во внешний регион, мы должны помнить, что нужно указать '' outer = TRUE ''; в противном случае он добавляется к последнему подзаголовку. Также обратите внимание, что я указал '' cex = 0.67 '', чтобы соответствовать размеру шрифта оси x оси y.

Теперь я согласен, что отображение тепловых единиц в отдельном подзаголовке не является оптимальным, хотя это правильный способ его отображения. Но была проблема с клещами. Мы действительно хотим отобразить некоторые хорошие значения, которые ясно показывают, что они не являются линейными. Но ваши данные не обязательно содержат эти хорошие значения, поэтому нам придется интерполировать их сами. Для этого я использую «» «» splinefun

lbl <- c(0, 2, 200, 1000, 2000, 3000, 4000) 
thermals <- splinefun(cobs10$gdd, cobs10$date) # thermals is a function that returns the date (as an integer) for a requested value 
thermals(lbl) 
## [1] 14649.00 14686.79 14709.55 14761.28 14806.04 14847.68 14908.45 
ticks <- as.Date(thermals(lbl), origin='1970-01-01') # remember to specify an origin when converting an integer to a Date. 

Теперь тепловые клещи находятся в месте, позволяет попробовать.

par(mfrow=c(2,1), mar=c(0.6, 5.1, 0, 0.6), oma=c(5.1, 0, 4, 0)) 
plot(temp ~ date, data=cobs10, type='l', xaxt='n', ylab='Temperatur (C)') 
plot(precip ~ date, data=cobs10, type='l', xaxt='n', ylab='Precipitation (cm)') 

usr <- par('usr') 
x.pos <- (usr[2]+usr[1])/2 

ticks <- seq(from=min(cobs10$date), by='2 months', length=7) 
lbl <- strftime(ticks, '%b') 
axis(side=1, outer=TRUE, at=ticks, labels=lbl) 
mtext('2010', side=1, at=x.pos, line=3) 

lbl <- c(0, 2, 200, 1000, 2000, 3000, 4000) 
thermals <- splinefun(cobs10$gdd, cobs10$date) # thermals is a function that returns the date (as an integer) for a requested value 
ticks <- as.Date(thermals(lbl), origin='1970-01-01') # remember to specify an origin when converting an integer to a Date. 
axis(side=3, outer=TRUE, at=ticks, labels=lbl) 
mtext('Thermal units', side=3, line=15, at=x.pos) 

enter image description here

Update Я изменил функцию mtext вызывает в последнем блоке кода, чтобы гарантировать, что тексты х-оси сосредоточены на черчения область, а не весь регион. Вы можете настроить вертикальное положение, изменив режим line.

+0

Спасибо, я не думаю, что я понимал, как «работает», и я никогда не получил бы маркировку. Это было прекрасно. – Nazer

+0

Большое спасибо @MrGumble! Я понял, что нарушил правила с таким количеством сериалов на одном сюжете, но разве мы не используем R, чтобы мы могли делать именно то, что хотим? Похоже на некоторые веские причины, чтобы разбить его, и ваша последняя фигура прекрасна. Я заменю оригинал и отправлю его для публикации. – Nazer

+0

Прохладный! Рад, что вам это нравится. Я немного обновил код в последнем блоке кода, поэтому метки оси x («2010» и «Термические единицы» расположены горизонтально по области построения графика, а не по всему окну. – MrGumble

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