Применить имена столбцов к легенде в функции - PullRequest
0 голосов
/ 05 июля 2019

Я пишу функцию, которая берет две переменные - в идеале столбцы из одного фрейма данных - и выводит их на график.Сюжет также будет включать в себя легенду с использованием имен из столбцов, и вот тут я сталкиваюсь с трудностями.

Код ниже настолько близок к желаемому результату, насколько я могу получить.Меня интересует только использование базы R.

plotpairs <- function(x,y){
  plot(x, type = "l", col = "red")
  lines(y, type = "l", col = "blue")
  legend(0,ylim_max, legend = paste0(x, y), lwd = c(5,5), col = c("red", "blue"), bty = "n")
}

plotpairs(df$F3, df$F4)

enter image description here

Ответы [ 3 ]

1 голос
/ 05 июля 2019

Это отображает указанные столбцы из фрейма данных, заданного в качестве первого аргумента, или, если имена не указаны, тогда отображаются первые два столбца.Обратите внимание, что сначала мы строим оба графика, используя type = "n", чтобы убедиться, что график настроен достаточно большим, чтобы вместить обе переменные.В примере используется встроенный фрейм данных trees.

plotpairs <- function(data, name1 = names(data)[1], name2 = names(data)[2]) {
  both <- c(data[[name1]], data[[name2]])
  plot(seq_along(both) / 2, both, type = "n", xlab = "", ylab = "")
  lines(data[[name1]], type = "l", col = "red")
  lines(data[[name2]], type = "l", col = "blue")
  legend("topleft", legend = c(name1, name2), lwd = 5, 
    col = c("red", "blue"), bty = "n")
}

plotpairs(trees, "Girth", "Volume")

screenshot

1 голос
/ 05 июля 2019

Если вы указали data.frame или matrix в качестве аргумента, вы можете извлечь имена столбцов, используя colnames(), в противном случае вы должны будете использовать deparse(substitute()) или match.call(), как я использовал здесь.

set.seed(1)
F3 <- cumsum(runif(1e3, -2, 2))+runif(1e3)
F4 <- cumsum(rnorm(1e3))+rnorm(1e3, 0, 0.5)
df <- data.frame(F3, F4)

plotpairs <- function(x, y) {
    if (NCOL(x) > 1) {
        nam <- colnames(x)[1:2]
        y <- x[,2]
        x <- x[,1]
    } else {
        nam <- as.character(match.call()[c("x", "y")])
    }
    plot(x, type="l", col="red", ylim=range(c(x, y)))
    lines(y, type="l", col="blue")
    legend("topleft", legend=nam, lwd=c(5, 5), col=c("red", "blue"), bty="n")

}
plotpairs(F3, F4)
with(df, plotpairs(F3, F4)) # same
plotpairs(df)               # same

enter image description here

0 голосов
/ 07 июля 2019

Я также разработал ответ, основанный на комментарии @Rui Barradas, который включал регулярное выражение. Поскольку я буду использовать входные данные, такие как "df $ F3", я могу рассчитывать на присутствующий символ "$", хотя это может ограничить гибкость кода.

plotpairs <- function(x,y){
xnam <- deparse(substitute(x))
ynam <- deparse(substitute(y))
xnam1 <- substring(xnam, regexpr("[$]", xnam)+1)
ynam1 <- substring(ynam, regexpr("[$]", ynam)+1)
plot(x, type = "l", col = "red")
lines(y, type = "l", col = "blue")
legend("topleft", legend = c(paste0(xnam1), paste0(ynam1)),lwd = c(5,5), col = c("red", "blue"), bty = "n")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...