如何更改“成对”函数产生的散点图对角线上的文本?

时间:2019-06-14 23:08:38

标签: r plot

我想更改R中以下代码所产生的对角线上的文本(我想更改显示Sepal.Length,Sepal.Width,Petal.Length和Petal.Width的文本)。

Graph produced by the code below

我已经尝试在“ 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])

2 个答案:

答案 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])

enter image description here

答案 1 :(得分:1)

这与@Axeman非常接近,但是我认为分配新标签的更具编程性的方法会有所帮助。

首先,像往常一样,您可以使用colnamessetNames或仅使用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])

使用此功能,您可以指定全部,部分或完全不指定标签;默认情况下,如果未找到新映射,则使用前一个标签,但可以在函数中轻松扩展该扩展以控制其他方法。

结果:

updated pairs plot, new diagonal labels

我最初保留@ {Axeman的答案中的mean(x)之类的内容,但是由于否则其他默认行为(使用名为textPanel的内部定义函数)似乎期望单个数字而不是向量,我相信mean是不必要的(尽管不是问题)。