lapply:生成几个具有不同标题的3D散点图

时间:2016-10-01 00:48:45

标签: r plot lapply

我试图在运行lapply时将元素名称放在图形的标题中。问题是名称不是迭代,只是在所有图中都显示了第一个名称。

数据示例和代码:

if(!require(scatterplot3d)) {
  install.packages("scatterplot3d"); require(scatterplot3d)}

head(palha_antes)
        X.mm Y.mm Altura.mm Rugosidade.mm
    1    0    0   198.421        24.677
    2   20    0   189.377        33.721
    3   40    0   199.212        23.886
    4   60    0   196.857        26.241
    5   80    0   193.048        30.050
    6  100    0   204.922        18.176

tratamentos = list(palha_antes, palha_depois, exposto_antes, exposto_depois)

names = c("Tratamento com palha antes da chuva",
          "Tratamento com palha depois da chuva",
          "Tratamento sem palha antes da chuva",
          "Tratamento sem palha depois da chuva")

names(tratamentos) <- names

par(mfrow = c(2,2))
lapply(tratamentos, function (x) {
  scatterplot3d(as.numeric(unlist(x[1])), as.numeric(unlist(x[2])),
                as.numeric(unlist(x[3])), xlab = "X (mm)",ylab = "Y (mm)",
                main = lapply(names(tratamentos), function(y) y), zlab = "Altura (mm)", pch = 20)
})
par(mfrow = c(1,1))

部分main = lapply(names(tratamentos), function(y) y)未按预期运行:1

如果我将x作为y main = lapply(names(tratamentos), function(y) x)的函数,则绘图将获取变量x的所有值,而不是名称。那么,您有什么建议来解决这部分代码吗?谢谢。

1 个答案:

答案 0 :(得分:0)

为什么你需要2 lapply?以下作品。

tratamentos = list(palha_antes, palha_depois, exposto_antes, exposto_depois)

## don't use "names"; that will mask function "names"
NAMES <- c("Tratamento com palha antes da chuva",
           "Tratamento com palha depois da chuva",
           "Tratamento sem palha antes da chuva",
           "Tratamento sem palha depois da chuva")

par(mfrow = c(2,2))
lapply(1:length(tratamentos), function (i) {
  scatterplot3d(tratamentos[[i]][[1]], tratamentos[[i]][[2]],
                tratamentos[[i]][[3]], xlab = "X (mm)", ylab = "Y (mm)",
                main = NAMES[i], zlab = "Altura (mm)", pch = 20)
})
par(mfrow = c(1,1))

基本上没有必要使用lapplyfor循环是完美的:

par(mfrow = c(2,2))
for (i in 1:length(tratamentos)) {
  scatterplot3d(tratamentos[[i]][[1]], tratamentos[[i]][[2]],
                tratamentos[[i]][[3]], xlab = "X (mm)", ylab = "Y (mm)",
                main = NAMES[i], zlab = "Altura (mm)", pch = 20)
  }
par(mfrow = c(1,1))

可重复的示例

set.seed(0)
d <- data.frame(x = rnorm(50), y = rnorm(50), z = rnorm(50))
lst <- list(d, d, d, d)
NAMES <- LETTERS[1:4]

## `for` loop
par(mfrow = c(2,2))
for (i in 1:length(lst)) {
  scatterplot3d(lst[[i]][[1]], lst[[i]][[2]],
                lst[[i]][[3]], xlab = "X (mm)", ylab = "Y (mm)",
                main = NAMES[i], zlab = "Altura (mm)", pch = 20)
  }
par(mfrow = c(1,1))

## `lapply`
par(mfrow = c(2,2))
lapply(1:length(lst), function (i) {
  scatterplot3d(lst[[i]][[1]], lst[[i]][[2]],
                lst[[i]][[3]], xlab = "X (mm)", ylab = "Y (mm)",
                main = NAMES[i], zlab = "Altura (mm)", pch = 20)
})
par(mfrow = c(1,1))

注意,scatterplot3d已返回值,因此如果您使用lapply,则会在屏幕上看到一个长列表。

enter image description here

对您的代码的评论

  • 您可以使用x[[1]]代替unlist(x[1]);我也不知道额外的as.numeric是什么;
  • lapply(names(tratamentos), function(y) y)只是as.list(names(tratamentos))