ggplot2 在函数或 S4 中使用时产生错误

发布于 2024-12-01 05:07:18 字数 5688 浏览 0 评论 0原文

当在 function 或 S4 中使用 ggplot2 时,我遇到了困难。这是我的没有功能的代码:

rm(list=ls(all=TRUE))
library(nlme)
data(Oats)
Data <- Oats

Data$Env <- factor(Data$Block)
Data$Gen  <- factor(Data$Variety)

Data$Gen <- factor(Data$Gen)
Data$Env <- factor(Data$Env)
Gen.No <- length(levels(Data$Gen))
Env.No <- length(levels(Data$Env))
Min.G.E <- min(Gen.No, Env.No)

GGE.ANOVA <- aov(yield ~ Env + Env:Gen, data = Data)
GGE.Effs <- model.tables(GGE.ANOVA, type = "effects", cterms = "Env:Gen")$tables$"Env:Gen"
SVD <- svd(GGE.Effs)
D <- diag(SVD$d[1:Min.G.E])
E <- SVD$u%*%sqrt(D)
G <- SVD$v%*%sqrt(D)
Ecolnumb <- c(1:Min.G.E)
Ecolnames <- paste("PC", Ecolnumb, sep="")
dimnames(E) <- list(levels(Data$Env), Ecolnames)
dimnames(G) <- list(levels(Data$Gen), Ecolnames)
SVD.Values <- SVD$d
PC.No <- c(1:length(SVD.Values))
PC.SS <- SVD.Values^2
PC.Percent.SS <- PC.SS/sum(PC.SS)*100

library(grDevices)
con.hull.pos <- chull(G)
con.hull <- rbind(G[con.hull.pos, ], G[con.hull.pos[1], ])

getPerpPoints <- function(mat) {
x <- mat[,1]
y <- mat[,2]
out <- matrix(0, nrow = 2, ncol = 2)
if(diff(x) == 0) {
xnew <- x[1]
  }
  else {
xnew <- (diff(y) / diff(x)) * x[1] - y[1]
xnew <- xnew / (diff(y) / diff(x) + diff(x) / diff(y))
  }
  ynew <- -(diff(x) / diff(y)) * xnew
  out[2,] <- c(xnew, ynew)
  return(out = out)
    }
tmp <- t(sapply(1:(nrow(con.hull)-1),
     function(i) getPerpPoints(con.hull[i:(i+1),])[2, ]))
tmp <- as.data.frame(tmp)


library(ggplot2)
r <- 0.08
p <- ggplot(data = as.data.frame(G), aes(PC1, PC2)) + geom_point() + theme_bw()
p <- p + geom_text(aes(label = row.names(G)), size = 3, vjust = 1.25, colour = "black")
p <- p + geom_path(data = as.data.frame(con.hull), aes(PC1, PC2))
p <- p + geom_segment(data = as.data.frame(E), aes(xend = PC1, yend = PC2), x = 0, y = 0,
                  colour = "black", arrow = arrow(angle = 25, length = unit(0.25, "cm")))
p <- p + geom_text(data = as.data.frame(E), aes(label = row.names(E)),
               size = 3, vjust = 1.35, colour = "black")
p <- p + labs(list(x = sprintf("PC1 (%.1f%%)", PC.Percent.SS[1]),
               y = sprintf("PC2 (%.1f%%)", PC.Percent.SS[2])))
p <- p  + opts(axis.title.x = theme_text(size = 10, hjust = 0.54, vjust = 0))
p <- p  + opts(axis.title.y = theme_text(size = 10, angle = 90,  vjust = 0.25))
p <- p + xlim(range(c(E[ ,1], G[ ,1])) + range(c(E[ ,1], G[ ,1]))*r)
p <- p + ylim(range(c(E[ ,2], G[ ,2])) + range(c(E[ ,2], G[ ,2]))*r)
p <- p + geom_segment(data = as.data.frame(tmp), aes(xend = tmp$V1, yend = tmp$V2), x = 0, y = 0)
print(p)

输出是 在此处输入图像描述

但是当我在以下函数中使用相同的代码时,出现错误

rm(list=ls(all=TRUE))
PlotGGE <- function(Response, Env, Gen, Data) {

Data$Env <- factor(Data$Env)
Data$Gen  <- factor(Data$Gen)
Gen.No <- length(levels(Data$Gen))
Env.No <- length(levels(Data$Env))
Min.G.E <- min(Gen.No, Env.No)

GGE.ANOVA <- aov(yield ~ Env + Env:Gen, data = Data)
GGE.Effs <- model.tables(GGE.ANOVA, type = "effects", cterms = "Env:Gen")$tables$"Env:Gen"
SVD <- svd(GGE.Effs)
D <- diag(SVD$d[1:Min.G.E])
E <- SVD$u%*%sqrt(D)
G <- SVD$v%*%sqrt(D)
Ecolnumb <- c(1:Min.G.E)
Ecolnames <- paste("PC", Ecolnumb, sep="")
dimnames(E) <- list(levels(Data$Env), Ecolnames)
dimnames(G) <- list(levels(Data$Gen), Ecolnames)
SVD.Values <- SVD$d
PC.No <- c(1:length(SVD.Values))
PC.SS <- SVD.Values^2
PC.Percent.SS <- PC.SS/sum(PC.SS)*100

library(grDevices)
con.hull.pos <- chull(G)
con.hull <- rbind(G[con.hull.pos, ], G[con.hull.pos[1], ])

getPerpPoints <- function(mat) {
x <- mat[,1]
y <- mat[,2]
out <- matrix(0, nrow = 2, ncol = 2)
if(diff(x) == 0) {
xnew <- x[1]
  }
  else {
xnew <- (diff(y) / diff(x)) * x[1] - y[1]
xnew <- xnew / (diff(y) / diff(x) + diff(x) / diff(y))
  }
  ynew <- -(diff(x) / diff(y)) * xnew
  out[2,] <- c(xnew, ynew)
  return(out = out)
    }
tmp <- t(sapply(1:(nrow(con.hull)-1),
     function(i) getPerpPoints(con.hull[i:(i+1),])[2, ]))
tmp <- as.data.frame(tmp)


library(ggplot2)
r <- 0.08
p <- ggplot(data = as.data.frame(G), aes(PC1, PC2)) + geom_point() + theme_bw()
p <- p + geom_text(aes(label = row.names(G)), size = 3, vjust = 1.25, colour = "black")
p <- p + geom_path(data = as.data.frame(con.hull), aes(PC1, PC2))
p <- p + geom_segment(data = as.data.frame(E), aes(xend = PC1, yend = PC2), x = 0, y = 0,
                  colour = "black", arrow = arrow(angle = 25, length = unit(0.25, "cm")))
p <- p + geom_text(data = as.data.frame(E), aes(label = row.names(E)),
               size = 3, vjust = 1.35, colour = "black")
p <- p + labs(list(x = sprintf("PC1 (%.1f%%)", PC.Percent.SS[1]),
               y = sprintf("PC2 (%.1f%%)", PC.Percent.SS[2])))
p <- p  + opts(axis.title.x = theme_text(size = 10, hjust = 0.54, vjust = 0))
p <- p  + opts(axis.title.y = theme_text(size = 10, angle = 90,  vjust = 0.25))
p <- p + xlim(range(c(E[ ,1], G[ ,1])) + range(c(E[ ,1], G[ ,1]))*r)
p <- p + ylim(range(c(E[ ,2], G[ ,2])) + range(c(E[ ,2], G[ ,2]))*r)
p <- p + geom_segment(data = as.data.frame(tmp), aes(xend = tmp$V1, yend = tmp$V2), x = 0, y = 0)
print(p)
}

library(nlme)
data(Oats)

编辑

Oats$Env <- factor(Oats$Block)
Oats$Gen <- factor(Oats$Variety)
PlotGGE(Response = yield, Env = Env, Gen = Gen, Data = Oats)

错误是

Error in row.names(G) : object 'G' not found

任何帮助和/或评论将不胜感激。提前致谢。

I've tough time with ggplot2 when used in function or S4. Here is my code without function:

rm(list=ls(all=TRUE))
library(nlme)
data(Oats)
Data <- Oats

Data$Env <- factor(Data$Block)
Data$Gen  <- factor(Data$Variety)

Data$Gen <- factor(Data$Gen)
Data$Env <- factor(Data$Env)
Gen.No <- length(levels(Data$Gen))
Env.No <- length(levels(Data$Env))
Min.G.E <- min(Gen.No, Env.No)

GGE.ANOVA <- aov(yield ~ Env + Env:Gen, data = Data)
GGE.Effs <- model.tables(GGE.ANOVA, type = "effects", cterms = "Env:Gen")$tables$"Env:Gen"
SVD <- svd(GGE.Effs)
D <- diag(SVD$d[1:Min.G.E])
E <- SVD$u%*%sqrt(D)
G <- SVD$v%*%sqrt(D)
Ecolnumb <- c(1:Min.G.E)
Ecolnames <- paste("PC", Ecolnumb, sep="")
dimnames(E) <- list(levels(Data$Env), Ecolnames)
dimnames(G) <- list(levels(Data$Gen), Ecolnames)
SVD.Values <- SVD$d
PC.No <- c(1:length(SVD.Values))
PC.SS <- SVD.Values^2
PC.Percent.SS <- PC.SS/sum(PC.SS)*100

library(grDevices)
con.hull.pos <- chull(G)
con.hull <- rbind(G[con.hull.pos, ], G[con.hull.pos[1], ])

getPerpPoints <- function(mat) {
x <- mat[,1]
y <- mat[,2]
out <- matrix(0, nrow = 2, ncol = 2)
if(diff(x) == 0) {
xnew <- x[1]
  }
  else {
xnew <- (diff(y) / diff(x)) * x[1] - y[1]
xnew <- xnew / (diff(y) / diff(x) + diff(x) / diff(y))
  }
  ynew <- -(diff(x) / diff(y)) * xnew
  out[2,] <- c(xnew, ynew)
  return(out = out)
    }
tmp <- t(sapply(1:(nrow(con.hull)-1),
     function(i) getPerpPoints(con.hull[i:(i+1),])[2, ]))
tmp <- as.data.frame(tmp)


library(ggplot2)
r <- 0.08
p <- ggplot(data = as.data.frame(G), aes(PC1, PC2)) + geom_point() + theme_bw()
p <- p + geom_text(aes(label = row.names(G)), size = 3, vjust = 1.25, colour = "black")
p <- p + geom_path(data = as.data.frame(con.hull), aes(PC1, PC2))
p <- p + geom_segment(data = as.data.frame(E), aes(xend = PC1, yend = PC2), x = 0, y = 0,
                  colour = "black", arrow = arrow(angle = 25, length = unit(0.25, "cm")))
p <- p + geom_text(data = as.data.frame(E), aes(label = row.names(E)),
               size = 3, vjust = 1.35, colour = "black")
p <- p + labs(list(x = sprintf("PC1 (%.1f%%)", PC.Percent.SS[1]),
               y = sprintf("PC2 (%.1f%%)", PC.Percent.SS[2])))
p <- p  + opts(axis.title.x = theme_text(size = 10, hjust = 0.54, vjust = 0))
p <- p  + opts(axis.title.y = theme_text(size = 10, angle = 90,  vjust = 0.25))
p <- p + xlim(range(c(E[ ,1], G[ ,1])) + range(c(E[ ,1], G[ ,1]))*r)
p <- p + ylim(range(c(E[ ,2], G[ ,2])) + range(c(E[ ,2], G[ ,2]))*r)
p <- p + geom_segment(data = as.data.frame(tmp), aes(xend = tmp$V1, yend = tmp$V2), x = 0, y = 0)
print(p)

and the output is
enter image description here

But when I use the same code in the following function, I got error

rm(list=ls(all=TRUE))
PlotGGE <- function(Response, Env, Gen, Data) {

Data$Env <- factor(Data$Env)
Data$Gen  <- factor(Data$Gen)
Gen.No <- length(levels(Data$Gen))
Env.No <- length(levels(Data$Env))
Min.G.E <- min(Gen.No, Env.No)

GGE.ANOVA <- aov(yield ~ Env + Env:Gen, data = Data)
GGE.Effs <- model.tables(GGE.ANOVA, type = "effects", cterms = "Env:Gen")$tables$"Env:Gen"
SVD <- svd(GGE.Effs)
D <- diag(SVD$d[1:Min.G.E])
E <- SVD$u%*%sqrt(D)
G <- SVD$v%*%sqrt(D)
Ecolnumb <- c(1:Min.G.E)
Ecolnames <- paste("PC", Ecolnumb, sep="")
dimnames(E) <- list(levels(Data$Env), Ecolnames)
dimnames(G) <- list(levels(Data$Gen), Ecolnames)
SVD.Values <- SVD$d
PC.No <- c(1:length(SVD.Values))
PC.SS <- SVD.Values^2
PC.Percent.SS <- PC.SS/sum(PC.SS)*100

library(grDevices)
con.hull.pos <- chull(G)
con.hull <- rbind(G[con.hull.pos, ], G[con.hull.pos[1], ])

getPerpPoints <- function(mat) {
x <- mat[,1]
y <- mat[,2]
out <- matrix(0, nrow = 2, ncol = 2)
if(diff(x) == 0) {
xnew <- x[1]
  }
  else {
xnew <- (diff(y) / diff(x)) * x[1] - y[1]
xnew <- xnew / (diff(y) / diff(x) + diff(x) / diff(y))
  }
  ynew <- -(diff(x) / diff(y)) * xnew
  out[2,] <- c(xnew, ynew)
  return(out = out)
    }
tmp <- t(sapply(1:(nrow(con.hull)-1),
     function(i) getPerpPoints(con.hull[i:(i+1),])[2, ]))
tmp <- as.data.frame(tmp)


library(ggplot2)
r <- 0.08
p <- ggplot(data = as.data.frame(G), aes(PC1, PC2)) + geom_point() + theme_bw()
p <- p + geom_text(aes(label = row.names(G)), size = 3, vjust = 1.25, colour = "black")
p <- p + geom_path(data = as.data.frame(con.hull), aes(PC1, PC2))
p <- p + geom_segment(data = as.data.frame(E), aes(xend = PC1, yend = PC2), x = 0, y = 0,
                  colour = "black", arrow = arrow(angle = 25, length = unit(0.25, "cm")))
p <- p + geom_text(data = as.data.frame(E), aes(label = row.names(E)),
               size = 3, vjust = 1.35, colour = "black")
p <- p + labs(list(x = sprintf("PC1 (%.1f%%)", PC.Percent.SS[1]),
               y = sprintf("PC2 (%.1f%%)", PC.Percent.SS[2])))
p <- p  + opts(axis.title.x = theme_text(size = 10, hjust = 0.54, vjust = 0))
p <- p  + opts(axis.title.y = theme_text(size = 10, angle = 90,  vjust = 0.25))
p <- p + xlim(range(c(E[ ,1], G[ ,1])) + range(c(E[ ,1], G[ ,1]))*r)
p <- p + ylim(range(c(E[ ,2], G[ ,2])) + range(c(E[ ,2], G[ ,2]))*r)
p <- p + geom_segment(data = as.data.frame(tmp), aes(xend = tmp$V1, yend = tmp$V2), x = 0, y = 0)
print(p)
}

library(nlme)
data(Oats)

EDIT

Oats$Env <- factor(Oats$Block)
Oats$Gen <- factor(Oats$Variety)
PlotGGE(Response = yield, Env = Env, Gen = Gen, Data = Oats)

The error is

Error in row.names(G) : object 'G' not found

Any help and/or comments will be highly appreciated. Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

葬心 2024-12-08 05:07:18

与原始版本相比,您在函数中的版本在开头缺少以下两行:

Data$Env <- factor(Data$Block)
Data$Gen  <- factor(Data$Variety)

您是否尝试过使用 debug() 逐步执行函数以查找错误源?

Your version in the function is missing the following two lines at the very beginning compared to the original version:

Data$Env <- factor(Data$Block)
Data$Gen  <- factor(Data$Variety)

Have you experimented with using debug() to step through functions to find the source of errors?

没有你我更好 2024-12-08 05:07:18

只需将 label 列添加到数据框中即可。
另外,请注意,aes 中绝对不应该有 $。

这应该有效:

G1 <- data.frame(G, label=rownames(G))
E1 <- data.frame(E, label=rownames(E))

library(ggplot2)
r <- 0.08
p <- ggplot(data=G1, aes(PC1, PC2)) + geom_point() + theme_bw()
p <- p + geom_text(aes(label=label), size=3, vjust=1.25, colour="black")
p <- p + geom_path(data=as.data.frame(con.hull), aes(PC1, PC2))
p <- p + geom_segment(data=as.data.frame(E), aes(xend = PC1, yend=PC2),
                      x=0, y=0, colour="black",
                      arrow=arrow(angle=25, length=unit(0.25, "cm")))
p <- p + geom_text(data=E1, aes(label=label),
                   size=3, vjust=1.35, colour="black")
p <- p + labs(list(x=sprintf("PC1 (%.1f%%)", PC.Percent.SS[1]),
                   y=sprintf("PC2 (%.1f%%)", PC.Percent.SS[2])))
p <- p  + opts(axis.title.x=theme_text(size=10, hjust=0.54, vjust=0))
p <- p  + opts(axis.title.y=theme_text(size=10, angle=90, vjust=0.25))
p <- p + xlim(range(c(E[ ,1], G[ ,1])) + range(c(E[ ,1], G[ ,1]))*r)
p <- p + ylim(range(c(E[ ,2], G[ ,2])) + range(c(E[ ,2], G[ ,2]))*r)
p <- p + geom_segment(data=tmp, aes(xend=V1, yend=V2), x=0, y=0)
print(p)

Just add a label columns to the data frames.
Also, note that you should never have a $ inside aes.

This should work:

G1 <- data.frame(G, label=rownames(G))
E1 <- data.frame(E, label=rownames(E))

library(ggplot2)
r <- 0.08
p <- ggplot(data=G1, aes(PC1, PC2)) + geom_point() + theme_bw()
p <- p + geom_text(aes(label=label), size=3, vjust=1.25, colour="black")
p <- p + geom_path(data=as.data.frame(con.hull), aes(PC1, PC2))
p <- p + geom_segment(data=as.data.frame(E), aes(xend = PC1, yend=PC2),
                      x=0, y=0, colour="black",
                      arrow=arrow(angle=25, length=unit(0.25, "cm")))
p <- p + geom_text(data=E1, aes(label=label),
                   size=3, vjust=1.35, colour="black")
p <- p + labs(list(x=sprintf("PC1 (%.1f%%)", PC.Percent.SS[1]),
                   y=sprintf("PC2 (%.1f%%)", PC.Percent.SS[2])))
p <- p  + opts(axis.title.x=theme_text(size=10, hjust=0.54, vjust=0))
p <- p  + opts(axis.title.y=theme_text(size=10, angle=90, vjust=0.25))
p <- p + xlim(range(c(E[ ,1], G[ ,1])) + range(c(E[ ,1], G[ ,1]))*r)
p <- p + ylim(range(c(E[ ,2], G[ ,2])) + range(c(E[ ,2], G[ ,2]))*r)
p <- p + geom_segment(data=tmp, aes(xend=V1, yend=V2), x=0, y=0)
print(p)
友欢 2024-12-08 05:07:18

如果您希望能够使用 rownames(G),则必须在 ggplot2 调用之外设置 as.data.frame(G) 。

在对 geom_text 的调用中设置 data=as.data.frame(G) 。

You have to set as.data.frame(G) outside of your ggplot2 call if you want to be able to use rownames(G).

Set data=as.data.frame(G) in your call to geom_text.

隔岸观火 2024-12-08 05:07:18
p <- p + geom_text(aes(label = row.names(G)), size = 3, vjust = 1.25, colour = "black")

您为其提供了一个图层,但没有要绘制的数据。将 label= 移动到对 ggplot 的原始调用中,或者提供带有 data= 参数的 geom_text()

p <- p + geom_text(aes(label = row.names(G)), size = 3, vjust = 1.25, colour = "black")

You're providing it with a layer, but no data to plot. Either move label= into your original call to ggplot or provide geom_text() with a data= argument

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文