2016-06-07 5 views
0

저는 R에 익숙하며 분산 형 플롯 매트릭스를 출력하는 일부 코드 작업 중입니다. 데이터 프레임의 형식은 다음과 같습니다쌍()을 사용하는 분산 형 플롯 행렬 R

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

내 데이터 세트 값의 넓은 규모로, 행의 100-1000s과 열 10-100s으로 실행할 수 있습니다 (따라서 내 데이터를 변환 로그).

이 코드 비트가 저 기본 플롯 향상 일부 부분적인 성공을 제공

(매립 화상을 참조)

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 개 값을 얻는 대신 NAs를 얻습니다. 이 문제를 어떻게 해결할 수 있습니까?
문제 2 - 상관 관계에 비례하여 R^2 값의 텍스트 크기를 조정하는 기능을 제거하고 싶습니다. 나는 그것이 패널에 있다는 것을 알고 있습니다. 그러나 어떤 부분을 제거 또는 조정해야할지 확실하지 않습니다. 사전에

많은 감사

는 편집 :

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

문제가 나타납니다 : 2016년 8월 6일
은 또한 코드를 단순화 주위에 작품을 발견했다 누락 된 값 즉 0입니다. 나는 이것들을 초기에 NA로 바꾸어 로그 스케일을 사용할 수 있습니다. 로그 변환과 결합하여 상단 패널에서 R^2 값이 누락됩니다.

이상적으로 나는 로그 스케일을 갖고 싶습니다. aformentioned 문제를 도입하지 않고도이 작업을 수행 할 수있는 방법이 있습니까?

설명 - 분산 형 그래프 (하단 패널)의 로그 (xy) 스케일과 막대 그래프의 x 축 (대각선 패널)이 필요합니다. 나는 오늘 그걸 가지고 놀았지만, 내가 원하는만큼 그것을 얻을 수는 없다. 아마 나는 쌍에서 너무 많이 묻고있다. 어떤 도움을 주시면 감사하겠습니다.

편집 :! 2016년 10월 6일

성공 ....도 약 99 % 행복입니다.

대칭 패널에 히스토그램을 추가하고 상단 패널에 p- 값 (x 축에 사용 된 로그 스케일로 인해 필요한 조정을 추가하기 위해 "pairs()"의 기본 코드)을 변경했습니다. 그들이 정확하거나 정확하지 않으면 내 설명을 수정 해 주시기 바랍니다 :

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 - 대각선 패널에서 텍스트 레이블이 부분적으로 만 나타납니다. 레이블이 나타날 때까지 레이블을 아래로 이동시킨 "pairs()"의 "label.pos"인수에 대한 값을 줄였습니다. 그러나 나는 그 값을 얼마나 많이 줄 일지라도 더 이상 움직이지 않을 것입니다. 히스토그램 함수에서 위치를 강제 변환하려고 시도했지만 작동하지 않습니다. 누군가 내가 누락 된 부분을 볼 수 있기를 바랍니다. 사전에 감사드립니다 ... 아직 반응이 없습니다. (

추신 : 제 3의 이미지를 성공적인 음모로 연결하려했으나 명성이 부족하여 좌절되었습니다. 신음 소리.

편집은 : 13/06/2016

해결! 조금 어리 석다. 대각선 패널에서 메인 타이틀의 배치를위한 수정은 매우 간단했고, 나는 이것을하기 위해 훨씬 더 복잡한 방법을 시도하면서 오랜 시간을 보냈다. 쌍의 "label.pos"인수는 음수 여야합니다! -0.0675의 작은 값을 사용하여 히스토그램이 포함 된 셀의 위쪽에 배치했습니다.

다른 사람들이 유용하다고 생각합니다. 해결 된 것으로 표시 하겠지만 내 코드 주석 또는 다른 사람이 코드를보다 효율적으로 만들 수있는 방법에 대해 의견을 보내 주시면 감사하겠습니다. 감사합니다 알렉스

+0

바보 같은 질문 어떻게 해결할 내 질문을 설정합니까? –

답변

1

가끔은 내가 완전히 밀도 느낍니다. 내 자신의 질문에 대답해라. 누가 생각 했을까? 내 수정에서 발견 된 수정 사항을 확인하십시오.

관련 문제