我想更改R中以下代码所产生的对角线上的文本(我想更改显示Sepal.Length,Sepal.Width,Petal.Length和Petal.Width的文本)。
我已经尝试在“ pairs”函数中为diag.panel参数插入一些内容,但是没有运气。
#Extracts the iris species column from the iris dataset
iris_class = iris$Species
#Change the class from characters to numerical values for indexing
# #1 = Iris-setosa
# #2 = Iris-versicolor
# #3 = Iris-virginica
class_to_number = as.numeric(factor(iris_class))
#A function to show the linear regression line in each graph
upper_panel_regression_line = function(x,y, ...){
points(x,y,...)
linear_regression = lm(y~x)
linear_regression_line = abline(linear_regression)
}
#A function to calculate and show the R-squared value of each panel
lower_panel_r_squared = function(x, y, ...){
usr <- par("usr"); on.exit(par(usr))
par(usr = c(0, 2, 0, 2))
r = cor(x, y)
r_squared = round(r^2, digits = 2)
text_of_r_squared = paste0("R-squared = ", r_squared)
text(1, 1, text_of_r_squared)
}
pairs(iris[1:4], main = "Predicting Iris Class",
lower.panel=lower_panel_r_squared, upper.panel =
upper_panel_regression_line, col=c("red","blue","green") [class_to_number])
答案 0 :(得分:1)
diag_custom_labels <- function(x, y, labels, cex, font, ...) {
if (!exists('i')) i <<- 1
text(mean(x), mean(y), c('my', 'custom', 'diag', 'labels')[[i]], cex = cex)
i <<- i + 1
}
pairs(iris[1:4], main = "Predicting Iris Class",
lower.panel=lower_panel_r_squared, upper.panel = upper_panel_regression_line,
text.panel = diag_custom_labels,
col=c("red","blue","green") [class_to_number])
答案 1 :(得分:1)
这与@Axeman非常接近,但是我认为分配新标签的更具编程性的方法会有所帮助。
首先,像往常一样,您可以使用colnames
或setNames
或仅使用names
来更改要输入的数据的列名。我假设这不是您想要的解决方案。
使用text.panel=
参数有点麻烦,因为必须预先定义它以通过与旧标签进行比较或知道位置来“知道”标签的含义。与其尝试成为超级幻想,不如建议我做些花哨的方法。
正如您在@Axeman的答案中(以及在?pairs
的文档中看到的那样),通常text.panel=
和其他参数采用一个函数,但是该函数的参数都不是用户可控制的,因此我们'将定义一个函数,该函数首先使用新标签,然后返回传递给pairs
的函数。
my.text.panel <- function(labels) {
function(x, y, lbl, ...) {
if (lbl %in% names(labels)) lbl <- labels[[lbl]]
text(x, y, lbl, ...)
}
}
pairs(iris[1:4], main = "Predicting Iris Class",
text.panel = my.text.panel(c(Sepal.Length="Slen", Sepal.Width="Swid",
Petal.Length="Plen", Petal.Width="Pwid")),
lower.panel = lower_panel_r_squared,
upper.panel = upper_panel_regression_line,
col=c("red","blue","green") [class_to_number])
使用此功能,您可以指定全部,部分或完全不指定标签;默认情况下,如果未找到新映射,则使用前一个标签,但可以在函数中轻松扩展该扩展以控制其他方法。
结果:
我最初保留@ {Axeman的答案中的mean(x)
之类的内容,但是由于否则其他默认行为(使用名为textPanel
的内部定义函数)似乎期望单个数字而不是向量,我相信mean
是不必要的(尽管不是问题)。