2014-12-22 6 views
0

Я пытаюсь построить данные в разделенные участки с помощью par (mfrow) и пытаюсь получить y логарифмическую ось y, оси определяются в порядке, но каким-то образом данные графика Не строится, и сюжет пуст.R: Логарифмическая ось y в контуре сюжета генерирует пустой сюжет

Мой вопрос: Кто-нибудь видит то, что кажется неправильным с моим кодом и почему ничего не отображается (код выполняется без ошибок)?

2-й вопрос: Как я могу определить метки и метки осей оси y, чтобы отображались только 10, 100 и 1000?

Вот мой код с некоторыми примерами данных xy, который имеет ту же структуру, что и мои исходные данные.

xy <- structure(list(GROUP = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("Group1", "Group2", "Group3"), class = "factor"), YEAR1 = c(1966L, 1967L, 1968L, 1969L, 1970L, 1971L, 1972L, 1973L, 1964L, 1965L,1966L, 1967L, 1968L, 1971L, 1972L, 1973L, 1974L, 1975L, 1976L), YEAR2 = c(1967L, 1968L, 1969L, 1970L, 1971L, 1972L,1973L, 1974L, 1965L, 1966L, 1967L, 1968L, 1969L, 1972L, 1973L,1974L, 1975L, 1976L, 1977L), SAMPLES1 = c(83L, 86L, 118L, 116L, 114L, 111L, 108L, 106L, 24L, 25L, 26L, 26L, 26L, 87L, 82L, 218L, 203L, 221L, 219L), SAMPLES2 = c(83L, 86L, 118L, 116L, 114L, 111L, 108L, 106L, 24L, 25L, 26L, 26L, 26L, 87L, 82L, 218L, 203L, 221L, 219L), RANK = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L,2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L)), .Names = c("GROUP","YEAR1", "YEAR2", "SAMPLES1", "SAMPLES2", "RANK"), class = "data.frame", row.names = c(NA, -19L)) 

ind <- split(x = xy,f = xy[,'RANK']) 
fname <- 'Plot.png' 
png(fname, width=4658, height=6716, res=300) 
par(mfrow=c(3,1), oma = c(2, 2, 2, 2)) 
# initiate plot 
for (i in seq_along(ind)){ 
    i <- ind[[i]] 
    xx = unlist(i[, c(2, 4)]) 
    yy = unlist(i[, c(3, 5)]) 
    my_x_lim <- range(c(1530, 2015)) 
    my_y_lim=range(c(yy,10,100)) 
    mar.default <- c(2,4,2,4) + 0.1 
    par(mar = mar.default + c(-1.2, 0, -1.2, 0),mgp = c(0, 1, 0)) 
    plot(xx, yy,log="y",xaxs="i",type='n', xlab=NA,ylab=NA,xlim = my_x_lim, ylim=my_y_lim,las=1,xaxt="n") 
    rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4], col = "grey") 
    par(mar = mar.default + c(-0.5, 0, -0.5, 0),mgp = c(0, 1, 0)) 
    axis(1, at = seq(1000, 2050, 10), cex.axis=0.7,lty=0, lwd.ticks=0,labels=TRUE, tcl=0) 
    par(mar = mar.default + c(-1, 0, -1, 0),mgp = c(0, 1, 0)) 
    apply(i, 1, function(y) 
    rect(y[2], min(y[3], 0), y[4], max(y[3], 0), col= 'seagreen',border=NA)) 
    par(mar = mar.default + c(-1.2, 0, -1.2, 0),mgp = c(0, 1, 0)) 
    axis(1, at = seq(1000, 2050, 5), cex.axis=0.5, labels=NA, tcl=-0.3) 
    axis(1, at = seq(1000, 2050, 10), cex.axis=0.5, labels=NA, tcl=-0.3,lwd.ticks=0.5) 
    axis(3, at = seq(1000, 2050, 5), cex.axis=0.5, labels=NA, tcl=-0.3) 
    axis(3, at = seq(1000, 2050, 10), cex.axis=0.5, labels=NA, tcl=-0.3,lwd.ticks=0.5) 
    axis(2, at = seq(-100000, 100000, 1000), cex.axis=0.5, labels=NA, tcl=-0.2,lwd.ticks=0.5) 
    axis(4, cex.axis=0.7, las=1, labels=TRUE) 
} 
dev.off() 
+1

При использовании 'apply' и есть строка где-то в ваших данных .frame, то все числа преобразуются вверх в строки, поэтому ваш вызов 'rect' передается строками, а не цифрами. Замените свой вызов с помощью 'apply (i, 1, function (y) {browser(); rect (y [2], min (y [3], 0), y [4], max (y [3], 0), col = 'red', border = NA)}) 'чтобы увидеть это в действии. – r2evans

ответ

1

У вас есть несколько проблем с кодом:

  1. Я думаю, вы неправильно Подменю код при назначении xx и yy. Я думаю, что ваша ось y основана на $SAMPLES[12] и вашей оси x на $YEAR[12], но вы назначаете $YEAR1 и $SAMPLE1 на xx, и аналогично yy. Исправьте ссылки столбца, и ваши данные, скорее всего, будут упорядочены/изменены правильно.

  2. Использование apply преобразует строку в вектор; обычно это нормально, но поскольку один из элементов ($GROUP) является строкой, все остальные элементы преобразуются вверх в строки, поэтому ваш вызов в середине приложения к rect использует строки, а не числа. Подмножество data.frame соответственно, например i[,-1].

  3. Ваша ось y логарифмическая, но вы используете нуль при вызове rect (log(0) не определено). Измените ссылки на ноль в rect на один, и они могут начать работать.

Используя данные xy, как определено выше, этот код выдает что-то, к вам, если это правильно и годным к употреблению:

ind <- split(x = xy,f = xy[,'RANK']) 
par(mfrow=c(3,1), oma = c(2, 2, 2, 2)) 
# initiate plot 
for (i in seq_along(ind)){ 
    i <- ind[[i]] 
    xx = unlist(i[, c(2, 3)]) 
    yy = unlist(i[, c(4, 5)]) 
    my_x_lim <- range(c(1530, 2015)) 
    my_y_lim=range(c(yy,10,100)) 
    mar.default <- c(2,4,2,4) + 0.1 
    par(mar = mar.default + c(-1.2, 0, -1.2, 0),mgp = c(0, 1, 0)) 
    plot(xx, yy,log="y",xaxs="i",type='n', xlab=NA,ylab=NA,xlim = my_x_lim, ylim=my_y_lim,las=1,xaxt="n") 
    rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4], col = "grey") 
    par(mar = mar.default + c(-0.5, 0, -0.5, 0),mgp = c(0, 1, 0)) 
    axis(1, at = seq(1000, 2050, 10), cex.axis=0.7,lty=0, lwd.ticks=0,labels=TRUE, tcl=0) 
    par(mar = mar.default + c(-1, 0, -1, 0),mgp = c(0, 1, 0)) 
    apply(i[, -1], 1, function(y) 
    rect(min(y[1:2]), min(y[3], 1), max(y[1:2]), max(y[3], 1), col= 'seagreen', border=NA)) 
    par(mar = mar.default + c(-1.2, 0, -1.2, 0),mgp = c(0, 1, 0)) 
    axis(1, at = seq(1000, 2050, 5), cex.axis=0.5, labels=NA, tcl=-0.3) 
    axis(1, at = seq(1000, 2050, 10), cex.axis=0.5, labels=NA, tcl=-0.3,lwd.ticks=0.5) 
    axis(3, at = seq(1000, 2050, 5), cex.axis=0.5, labels=NA, tcl=-0.3) 
    axis(3, at = seq(1000, 2050, 10), cex.axis=0.5, labels=NA, tcl=-0.3,lwd.ticks=0.5) 
    axis(2, at = seq(-100000, 100000, 1000), cex.axis=0.5, labels=NA, tcl=-0.2,lwd.ticks=0.5) 
    axis(4, cex.axis=0.7, las=1, labels=TRUE) 
} 
+0

спасибо @ r2evans. Не понял, что так много было испорчено, неудивительно, что это не сработало. Одна вещь, о которой я до сих пор не знаю, - это определение «rect (par (« usr ») [1], par (« usr ») [3], par (« usr ») [2], par (« usr ») [4], col = "gray") ', который от ответа Backlin на этот вопрос [link] (http://stackoverflow.com/questions/19219437/change-plot-area-background-color) и должен рисовать серый прямоугольник для определения цвета фона. Это как-то все еще не работает ... – kurdtc

+0

это может сработать, если вы добавите к нему 'xpd = TRUE', так как мне кажется, что он будет на краю границы рисунка. (См. 'Help (par)' для краткого определения.) – r2evans

+0

, что не работает. для параметров par («usr») я получаю '[1] 1530.0000000 2015.0000000 0.9462243 2.3981680', что неверно и не будет отображаться. – kurdtc