저는 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")'
문제점 (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)
이
문제가 나타납니다 : 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의 작은 값을 사용하여 히스토그램이 포함 된 셀의 위쪽에 배치했습니다.
다른 사람들이 유용하다고 생각합니다. 해결 된 것으로 표시 하겠지만 내 코드 주석 또는 다른 사람이 코드를보다 효율적으로 만들 수있는 방법에 대해 의견을 보내 주시면 감사하겠습니다. 감사합니다 알렉스
바보 같은 질문 어떻게 해결할 내 질문을 설정합니까? –