R

时间:2016-06-07 16:06:08

标签: r matrix plot

我是R的新手并且正在处理一些输出散点图矩阵的代码。数据框采用以下格式:

A B C D
2 3 0 5
8 9 5 4
0 0 5 3
7 0 0 0

我的数据集可以运行到100-1000行和10-100列,具有大范围的值(因此记录转换我的数据)。

这段代码在增强基本情节方面给了我一些部分成功(参见嵌入式图片):

panel.cor <- function(x, y, digits = 2, prefix = "", cex.cor, ...)
{
  usr <- par("usr"); on.exit(par(usr))
  par(usr = c(0, 1, 0, 1), xlog = FALSE, ylog = FALSE)
  r <- abs(cor(x, y))
  txt <- format(c(r, 0.123456789), digits = digits)[1]
  txt <- paste(prefix, txt)
  if(missing(cex.cor)) cex.cor <- 0.8/strwidth(txt)
  text(0.5, 0.5, txt, cex = cex.cor * r)
}

# Add regression line to plots.

my_line <- function(x,y,...){
  points(x,y,...)
  LR <- lm(log(x) ~ log(y), data = SP)
  abline(LR, col = "red", untf = TRUE)
}

# Plot scatter plot matrices.

pairs(mydataframe, pch = 20, main = "test",
      cex = 0.125, cex.labels = 1,
      xlim = c(100, 1e9),
      ylim = c(100, 1e9),
      upper.panel = panel.cor,
      lower.panel = my_line,
      log = "xy")'

example

问题1 - 我没有在上面板中获得R ^ 2值,而是获得了NA。我怎么能纠正这个?
问题2 - 我想删除与相关性成比例地调整R ^ 2值的文本大小的功能。我知道它在panel.cor中,但不确定哪个部分需要删除或调整。

非常感谢提前

编辑:08/06/2016
我找到了一个可以简化代码的工作:

panel.cor <- function(x, y, digits = 2, cex.cor, ...)
{
  usr <- par("usr"); on.exit(par(usr))
  par(usr = c(0, 1, 0, 1))
  # correlation coefficient
  r <- cor(x, y)
  txt <- format(c(r, 0.123456789), digits = digits)[1]
  txt <- paste("r= ", txt, sep = "")
  text(0.5, 0.6, txt)
}

# add regression line to plots.

my_line <- function(x,y,...)
{
  points(x,y,...)
  LR <- lm(x ~ y, data = SP)
  abline(LR, col = "red", untf = TRUE)
}

# Plot scatterplot matrices.

pairs(SP, pch = 20, main = "test",
      cex = 0.125, cex.labels = 1,
      upper.panel = panel.cor,
      lower.panel = my_line)

example 2

问题似乎是缺少值,即0。我最初将这些更改为NA,因此我可以使用对数刻度。这与对数转换相结合导致上面板中缺少R ^ 2值。

理想情况下,我希望有一个对数刻度。有没有办法在不引入上述问题的情况下做到这一点?

澄清 - 我喜欢散点图(下图)中的log(xy)比例和直方图中的x轴(对角线面板)。我今天一直在玩它,但不能像我想的那样得到它。也许我对成对要求太多了。任何帮助将不胜感激。

编辑:2016年6月10日

成功!......大约99%的幸福。

我做了更改 - 在对角线面板上添加了直方图,向上面板添加了p值(&#34中的基本代码;对()&#34;用于添加直方图所需的调整,因为在x轴)。如果他们的描述不准确或正确,请随时更正我的描述:

library(lattice)
DF <- read.csv("File location", header = TRUE)
DF.1 <- DF+1 # Added small epsilon to data frame otherwise plot errors arise due to missing values.

# Function to calculate R^2 & p-value for upper panels in pairs() - scatterplot matrices.

panel.cor <- function(x, y, digits = 3, cex.cor, ...)
{
  usr <- par("usr"); on.exit(par(usr))
  par(usr = c(0, 1, 0, 1), xlog = FALSE, ylog = FALSE) # xlog/ylog: ensures that R^2 and p-values display in upper panel.
  # Calculate correlation coefficient and add to diagonal plot.
  r <- cor(x, y)
  txt <- format(c(r, 0.123456789), digits = digits)[1]
  txt <- paste("r= ", txt, sep = "")
  text(0.5, 0.7, txt, cex = 1.25) # First 2 arguments determine postion of R^2-value in upper panel cells.

  # Calculate P-value and add to diagonal plot.
  p <- cor.test(x, y)$p.value
  txt2 <- format(c(p, 0.123456789), digits = digits)[1]
  txt2 <- paste("p= ", txt2, sep = "")
  if(p<0.01) txt2 <- paste("p= ", "<0.01", sep = "")
  text(0.5, 0.3, txt2, cex = 1.25) # First 2 arguments determine postion of p-value in upper panel cells.
}

# Function to calculate frequency distribution and plot histogram in diagonal plot.

panel.hist <- function(x, ...)
{
  usr <- par("usr"); on.exit(par(usr))
  par(usr = c(0.5, 1.5, 0, 1.75), xlog = TRUE, ylog = FALSE) # xlog argument allows log x-axis when called in pairs.
  h <- hist(log(x), plot = FALSE, breaks = 20)
  breaks <- h$breaks; nB <- length(breaks)
  y <- h$counts; y <- y/max(y)
  rect(breaks[-nB], 0, breaks[-1], y, col = "cyan")
}

# add regression line to plots.

my_line <- function(x,y, ...)
{
  points(x,y,...)
  LR <- lm(log(x) ~ log(y), data = DF.1)
  abline(LR, col = "red", untf = TRUE)
}

# Plot scatterplot matrices.

pairs(DF.1, pch = 20, main = "Chart Title",
      cex = 0.75, cex.labels = 1.5, label.pos = 0.0001,
      upper.panel = panel.cor,
      lower.panel = my_line,
      diag.panel = panel.hist,
      log = ("xy"),
      xlim = c(5, 1e9),
      ylim = c(5, 1e9))
美中不足:

1 - 对角线面板中的文本标签仅部分显示。我在&#34; label.pos&#34;中使用了递减值。参数&#34;对()&#34;它将标签向下移动直到它们出现。然而,无论我减少多少价值,他们都不会再动了。我试图从直方图函数强制改变位置,但这并不起作用。我希望有人能看到我失踪的东西。在此先感谢...我还没有任何回复:(

PS:我试图将第三张图片与我成功的情节联系起来,但我因为缺乏声誉而被挫败......呻吟。

编辑:2016年6月13日

解决!我觉得有点傻。在对角线面板中定位主标题的修复非常简单,我花了很长时间尝试更复杂的方法来做到这一点。 &#34; label.pos&#34;成对的论证应该是否定的!我使用了一个小值-0.0675,它将它放在包含直方图的单元格顶部附近。

我希望其他人觉得这很有用。我将标记为已解决,但我感谢任何有关我的代码评论的评论,或者有人看到了使代码更有效的方法。谢谢Alex

1 个答案:

答案 0 :(得分:2)

有时我觉得自己很密集。回答我自己的问题......谁会想到......打耳光。有关我找到的修补程序,请参阅我的帖子中的编辑。