2011-06-22 6 views
2

Я хотел бы сделать участок с 4 осей в R так, что он похож на этот сюжет:Как сделать следующий график, используя R?

enter image description here

Я смотрел на Quick-R website за совет и измененный один из их примеров (так называемого A Silly Axis Example):

# specify the data 
x <- c(1:5); y <- x/2; 
w <- c(2:4) 
z <- c(1:5) 

# create extra margin room on the right for an axis 
par(mar=c(5, 4, 4, 8) + 0.1) 

# plot x vs. y 
plot(x, y,type="b", pch=21, col="red", 
    yaxt="n", lty=3, xlab="", ylab="") 

# add x vs. 1/x 
lines(x, z, type="b", pch=22, col="blue", lty=2) 

# draw an axis on the left 
axis(2, at=x,labels=x, col.axis="red", las=2) 

# draw an axis on the right, with smaller text and ticks 
axis(4, at=w,labels=round(w,digits=2), 
    col.axis="blue", las=2, cex.axis=0.7, tck=-.01) 

# draw an axis on the top 
axis(3, at=z,labels=round(z,digits=2), 
    col.axis="blue", las=2, cex.axis=0.7, tck=-.01) 

# add a title for the right axis 
mtext("L", side=3, line=3, cex.lab=1,las=2, col="blue") 

# add a title for the right axis 
mtext("OSR", side=4, line=3, cex.lab=1,las=2, col="red") 

# add a main title and bottom and left axis labels 
title("", xlab="GSI", ylab="FSI") 

Этот код производит следующий сюжет: enter image description here

У меня DIF Трудно понять, как разные оси могут иметь разные масштабы. Например, мне нужна верхняя ось L, чтобы перейти от 5 до 13, но если я установил z <-c(5:13), она не будет устанавливать ось в эти значения. Тем не менее, я могу переписать то, что метки:

axis(3, at=z,labels=round(c(9:13),digits=2), col.axis="blue", 
las=2, cex.axis=0.7, tck=-.01) 

но если я хочу, чтобы построить точку с этими четырьмя параметрами, точка не будет отображаться в правильном месте. Как мне это сделать?

ответ

3

Один (возможно, громоздкий) вариант должен был бы написать функции преобразования, которые преобразуют значения между двумя вашими шкалами. Предполагая, что вы знаете диапазоны данных для верхних и нижних топоров впереди времени, вы могли бы написать такую ​​функцию:

convertScaleToBottom <- function(x,botRange,topRange){ 
    temp <- (x - topRange[1])/(topRange[2] - topRange[1]) 
    return(botRange[1] + (temp * (botRange[2] - botRange[1]))) 
} 

, который принимает множество значений, x, в верхней шкале оси и преобразует их в шкала нижней оси. Затем вы можете построить преобразованные значения и сохранить оригиналы в качестве меток:

z1 <- 5:13 
z1Adj <- convertScaleToBottom(z1,range(x),range(z1)) 

# draw an axis on the top 
axis(3, at=z1Adj,labels=round(z1,digits=2), 
    col.axis="blue", las=2, cex.axis=0.7, tck=-.01) 

Этот метод легко модифицируется, чтобы изменить порядок оси волчка:

convertScaleToBottomRev <- function(x,botRange,topRange){ 
    temp <- (x - topRange[1])/(topRange[2] - topRange[1]) 
    return(botRange[2] - (temp * (botRange[2] - botRange[1]))) 
} 
+0

Спасибо за ответ Joran; Это работает хорошо. Только одно уточнение, могу ли я построить точку с использованием второстепенных осей, и будет ли она считать, что расстояние между метками этих осей? – djq

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