Вы в значительной степени получили решение уже:
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
Я был немного раздражен вашим использованием трех различных серий в одном участке. Есть много причин, по которым это хлопотно.
- Имея два у-значения всегда хлопотно эту статью из Stephen Few (перейти на страницу 5 мой любимый пример); в вашем случае это не так серьезно из-за характера сюжетов и использования вами цветов, чтобы указать, к какой оси y относятся значения. Но все же, в принципе.
- Осевые тики должны иметь фиксированную функцию, например. линейный или логарифм. С вашими тепловыми единицами они появляются «случайно» (я знаю, что это не так, но для аутсайдера они делают).
- Мы должны что-то сделать с вашими тиками 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')
Здесь, мне очень нравится клещами х-оси и были некоторые проблемы тиражирование его. «хорошенький» на датах настаивал либо на 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')
Это выглядит хорошо, но не с клещами на вершине участков. Нехорошо. Естественно, мы можем включить тики в первых двух графиках (с '' 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)
С «» довольно «» не ведет себя, как мы хотим, чтобы мы используем «» Последовательность «», чтобы сделать последовательность оси х клещей. Затем мы отформатируем даты, чтобы просто отобразить аббревиатуру названия месяца, но это делается с учетом местных настроек (я живу в Дании), см. «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)
Update Я изменил функцию mtext
вызывает в последнем блоке кода, чтобы гарантировать, что тексты х-оси сосредоточены на черчения область, а не весь регион. Вы можете настроить вертикальное положение, изменив режим line
.
Спасибо, я не думаю, что я понимал, как «работает», и я никогда не получил бы маркировку. Это было прекрасно. – Nazer
Большое спасибо @MrGumble! Я понял, что нарушил правила с таким количеством сериалов на одном сюжете, но разве мы не используем R, чтобы мы могли делать именно то, что хотим? Похоже на некоторые веские причины, чтобы разбить его, и ваша последняя фигура прекрасна. Я заменю оригинал и отправлю его для публикации. – Nazer
Прохладный! Рад, что вам это нравится. Я немного обновил код в последнем блоке кода, поэтому метки оси x («2010» и «Термические единицы» расположены горизонтально по области построения графика, а не по всему окну. – MrGumble