#r
#r
Вопрос:
У меня есть код, подобный приведенному ниже. Но я не получаю все метки оси x, и они не отображаются под углом 45 градусов, когда я пытаюсь отобразить это в формате pdf. Поскольку я новичок, пожалуйста, помогите мне исправить этот параметр.
pdf(file="figure.pdf", height=3.5, width=5, onefile=TRUE)
Runtime <- c(579,0,581,610,830,828,592,651,596,596,591,581,587,594,604,606,447,434,445)
Runtime
g_range <- range(0,Runtime)
g_range
plot(Runtime, type="o", col="blue", ylim=g_range,axes=FALSE, ann=FALSE)
lab=c('2011-07-20','2011-08-03','2011-08-10','2011-08-17','2011-08-24','2011-08-25','2011-08-27','2011-08-31','2011-09-07','2011-09-10','2011-09-14','2011-09-21','2011-09-28','2011-10-05','2011-10-06','2011-10-07','2011-10-13','2011-10-19','2011-10-31')
box()
lab
axis(1, at=1:19, lab=F)
text(axTicks(1), par("usr")[3] - 2, srt=45, adj=1, labels=lab, xpd=T, cex=0.8)
axis(2, las=1, at=500*0:g_range[2])
title(main="Runtime", col.main="red", font.main=4)
title(xlab="Build", col.lab=rgb(0,0.5,0))
title(ylab="MS", col.lab=rgb(0,0.5,0))
legend(1, g_range[2], c("AveElapsedTime"), cex=0.8, col=c("blue"), pch=21, lty=1);
dev.off()
Комментарии:
1. Вы можете использовать только вертикальное или горизонтальное использование
las
. Если вам нужны угловые метки, вы должны написать их самостоятельно, используяtext
: 128.97.141.26/stat/R/faq/angled_labels.htm2. @James err, ошибка заключается в Смотрите
text()
вызов сsrt
.3. Упс! Только что отсканировал код и увидел только вызовы оси.
Ответ №1:
Когда я запускаю ваш код, я не получаю изображение, которое вы показываете. Проблема в этой строке:
text(axTicks(1), par("usr")[3] - 2, srt=45, adj=1, labels=lab, xpd=T, cex=0.8)
as axTicks(1)
возвращает:
> axTicks(1)
[1] 5 10 15
Итак, что происходит, так это то, что ваши 19 меток отображаются в этих 3 местах.
Если вы хотите построить график в местах расположения отметок ( 1:19
), то:
text(1:19, par("usr")[3] - 2, srt=45, adj=1, labels=lab, xpd=T, cex=0.8)
будет работать.
Вот полный пример, основанный на вашем коде.
Runtime <- c(579,0,581,610,830,828,592,651,596,596,591,581,587,
594,604,606,447,434,445)
g_range <- range(0,Runtime)
lab <- c('2011-07-20','2011-08-03','2011-08-10','2011-08-17','2011-08-24',
'2011-08-25','2011-08-27','2011-08-31','2011-09-07','2011-09-10',
'2011-09-14','2011-09-21','2011-09-28','2011-10-05','2011-10-06',
'2011-10-07','2011-10-13','2011-10-19','2011-10-31')
## plot
op <- par(mar = c(6,4,4,2) 0.1) ## bigger bottom margin
plot(Runtime, type="o", col="blue", ylim=g_range, axes=FALSE, ann=FALSE)
box()
axis(1, at=1:19, lab=FALSE)
text(1:19, par("usr")[3] - 40, srt=45, adj=1.2, labels=lab, xpd=T, cex=0.7)
axis(2, las=1, at=500*0:g_range[2])
title(main="Runtime", col.main="red", font.main=4)
title(xlab="Build", col.lab=rgb(0,0.5,0), line = 4.5)
title(ylab="MS", col.lab=rgb(0,0.5,0))
legend("topright", c("AveElapsedTime"), cex=0.8, col=c("blue"), pch=21, lty=1)
## reset par
par(op)
С этим, возможно, лучше справиться с помощью функции в пакете gridBase, которая позволяет смешивать сеточную и базовую графику. Причина, по которой я говорю, что это могло бы быть лучше, заключается в том, что вы можете указать, что y
координата должна задаваться в терминах количества строк, а не пытаться вычислить подходящее значение для y
в терминах отображаемых данных.
Вот пример:
## load gridBase
require(gridBase)
## do the base plot parts
op <- par(mar = c(6,4,4,2) 0.1) ## bigger bottom margin
plot(1:19, Runtime, type="o", col="blue", ylim=g_range, axes=FALSE, ann=FALSE)
box()
axis(1, at=1:19, lab=FALSE)
axis(2, las=1, at=500*0:g_range[2])
title(main="Runtime", col.main="red", font.main=4)
title(xlab="Build", col.lab=rgb(0,0.5,0), line = 4.5)
title(ylab="MS", col.lab=rgb(0,0.5,0))
legend("topright", c("AveElapsedTime"), cex=0.8, col=c("blue"), pch=21, lty=1)
## at this point, DO NOT alter the dimensions of the plotting window
## now do the grid business
vps <- baseViewports()
pushViewport(vps$inner, vps$figure, vps$plot)
## this adds the text
grid.text(lab, x = unit(1:19, "native"), y = unit(-1, "lines"),
just = "right", rot = 60, gp = gpar(cex = 0.7))
## this finishes off the viewport - you have to do this or things will go wrong:
popViewport(3)
## reset par
par(op)
Обратите внимание, что это может быть немного придирчиво к отображению на экране, повторный запуск примера gridBase в моей установке R 2.13.2 не приводит к появлению каких-либо меток. Закрытие устройства и повторный запуск кода все же работают. Я не думаю, что это должно быть проблемой, если вы рисуете на pdf()
устройстве.
Комментарии:
1. 1 для
"topright"
в легенде. Мнеadj=1.2
также нравится вtext
; если бы я продолжал настраивать, я бы переместил метку x еще ниже (она закрывается метками с отметками) и увеличил поле для компенсации…2. @BenBolker Хорошие моменты. Я перестал возиться с
y
координатами, поскольку вспомнил, что есть лучший способ сделать это с помощью базы данных . Показан другой пример, использующий это вместо того, чтобы возиться с пользовательскими координатами.3. Большое тебе спасибо, Гэвин.. Это работает замечательно.. Спасибо Бену, Джеймсу за ваши комментарии..