R: противоречивая ошибка при добавлении линий сетки на график с использованием «plot (... panel.first = grid ())" - PullRequest
0 голосов
/ 12 марта 2019

Рассмотрим эту простую функцию:

plotTimeSeries = function(data) {
    # ensure that data is some type of time series object:
    if (!is.ts(data) && !is.zoo(data) && !is.xts(data)) {
        data = as.ts(data) 
    }

    plot(data, plot.type = "single", panel.first = grid())
}

Приведенный выше код получил идею рисовать линии сетки, используя plot(...panel.first = grid()) со страницы документации R (см. 2 примера в последнем блоке кода).

Предположим, что я называю его следующей матрицей в качестве аргумента данных:

m = matrix(nrow = 10, ncol = 3, data = rnorm(3 * 10))
dev.new(width = 5, height = 5)
plotTimeSeries(m)

Отлично работает, создает график с линиями сетки!

Но теперь предположим, что я называю это зоопарком:

z = zoo(x = m, order.by = 1:nrow(m))
dev.new(width = 5, height = 5)
plotTimeSeries(z)

Тогда он не строит график и печатает эту ошибку:

Error in int_abline(a = a, b = b, h = h, v = v, untf = untf, ...) : 
  plot.new has not been called yet

Почему это происходит, и есть ли лекарство?

Я почесал в Интернете. Я не нашел больше никого, кто бы упоминал эту ошибку. Наиболее близким является некоторый закомментированный код в строках 96-99 этой ссылки .

Мой поиск документации R в конечном итоге натолкнулся на эту ссылку для plot.default , в которой упоминается:

panel.first an ‘expression’ to be evaluated after the plot axes are set up but before any plotting takes place. This can be useful for drawing background grids or scatterplot smooths. Note that this works by lazy evaluation: passing this argument from other plot methods may well not work since it may be evaluated too early.

Мотивируемое этим, самое близкое, что я знаю о лечении, это сбросить panel.first arg сюжета и просто вызвать grid() после plot. Для вышеприведенной функции это будет означать использование кода

plot(data, plot.type = "single")
grid()

Я наткнулся на ошибку, которую нужно исправить?

Или panel.first - безнадежно ненадежный способ добавить линии сетки на график?

...