Может ли qgraph визуализировать метки ребер вне фактического ребра?
Я пытаюсь вставить метки ребер вне фактического ребра в моем qgraph для удобства чтения. Мне особенно не нравится опция добавления белого надписи под надписью, это завинчивает край. В соответствии с инструкцией можно регулировать положение метки кромки только вдоль линии, но не сбоку. Кто-нибудь раньше боролся с этим? Можно ли обойти эту проблему? ура
1 ответ
Кажется, не существует параметра для настройки поперечного расположения метки ребра. Одним из решений является добавление меток ребер на график отдельно. Ниже приведен пример, который привел к следующему сюжету. Общий метод состоит в том, чтобы получить компоновку графика, а затем использовать среднее значение для двух узлов, чтобы разместить текст вдоль линии. Существует ручная регулировка положения, так что текст, как правило, будет параллельным линии, но в основном вне линии (смещения по осям x и y основаны на синусе и косинусе угла). Если вы хотите больше контроля, вы можете вручную настроить некоторые из text()
места для лучших результатов.
library(qgraph)
# creating some random data
set.seed(10)
x1 <- rnorm(100,0,1)
x2 <- x1 + rnorm(100,0,0.2)
x3 <- x1 + x2 + rnorm(100,0,0.2)
x4 <- rnorm(100,0,1)
x5 <- x4 + rnorm(100,0,0.4)
x6 <- x4 + rnorm(100,0,0.4)
x7 <- x1 + x5 + rnorm(100,0,0.1)
# making a data frame
df <- cbind(x1,x2,x3,x4,x5,x6,x7)
# calculating the qgraph for the correlation matrix
# a stores the layout
a <- qgraph(cor(df,method="pearson")
,layout="spring"
,label.cex=0.9
,labels=colnames(df)
,label.scale=F
,details=T
,edge.labels=T
,doNotPlot=T
,alpha=0.05
,minimum='sig'
,sampleSize=100)
# plotting actual graph
qgraph(cor(df,method="pearson")
,layout="spring"
,label.cex=0.9
,labels=colnames(df)
,label.scale=F
,details=T
,edge.labels=F
,doNotPlot=T
,alpha=0.05
,minimum='sig'
,sampleSize=100)
# calculating significance
pvalMat <- Hmisc::rcorr(df,type="pearson")
# loop to add text
for(i in 1:(nrow(a$layout)-1)){
for(j in (i+1):nrow(a$layout)){
# is correlation statistically significant
if(pvalMat$P[i,j] < 0.05){
# using stored layout values, col1 is x, col2 is y
loc_center_x <- (a$layout[i,1]+a$layout[j,1])/2
loc_center_y <- (a$layout[i,2]+a$layout[j,2])/2
# finding angle of vector
rotation <- atan((a$layout[i,2]-a$layout[j,2])/(a$layout[i,1]-a$layout[j,1]))*180/pi
# radial separation
radius <- 0.1
# putting text at location
text(labels=round(cor(df,method="pearson")[i,j],digits=2) # text of correlation with rounded digits
,x=loc_center_x + abs(radius*sin(rotation*pi/180))
,y=loc_center_y + abs(radius*cos(rotation*pi/180))
,srt=rotation
,adj=c(0.5,0.5)
,cex=0.8)
}
}
}