как сделать название biplot более понятным с помощью ggbiplot


person Best    schedule 27.05.2015    source источник
comment
varname.size =5, varname.adjust =5 немного помогает   -  person user20650    schedule 27.05.2015
comment
@user20650 user20650 Я пытался использовать varname.size=3, varname.adjust=5, но это все еще недостаточно ясно. Я больше ищу способ публиковаться. но качество очень низкое, и я не знаю, что я должен сделать, чтобы сделать его более четким.   -  person Best    schedule 27.05.2015


Ответы (1)


Я думаю, что способ сделать это более понятным — настроить размер и положение меток, используя аргументы varname.sizeи varname.adjust. Тем не менее, с большим количеством переменных он все еще выглядит переполненным. Увеличивая длину стрелок (аналогично stats::biplot()), он выглядит несколько лучше (imo)

# install ggbiplot
#require(devtools)
#install_github('ggbiplot','vqv')

library(httr) 
library(ggbiplot)

# read data
url <- "https://gist.githubusercontent.com/anonymous/5f1135e4f750a39b0255/raw/data.txt"
dat <- read.table(text=content(GET(url), as="text"), header=TRUE)

# pca 
data.pca <- prcomp (dat, center = TRUE, scale =TRUE)

# original plot + increase labels size and space from line
p <- ggbiplot(data.pca, obs.scale=1, 
              var.scale=1, circle=F, 
              varname.size=4, varname.adjust=2)  
p

введите здесь описание изображения

# use coord_equal() to change size ratio of plot (excludes use of circle)
p <- p + coord_equal(1.5) + theme_classic()
p

введите здесь описание изображения

Чтобы удлинить стрелки, необходимо пересчитать координаты x и y. Затем вы можете использовать их для редактирования соответствующих grobs и изменения любого другого параметра (цвет, размер, поворот и т. д.). (вы можете использовать весь подход ggplotGrob(p), но просто используйте grid.edit() ниже.)

# function to rescale the x & y positions of the lines and labels
f <- function(a0, a1, M=M)
      {
      l <- lapply(as.list(environment()), as.numeric)
      out <- M* (l$a1 - l$a0) + l$a0
      grid::unit(out, "native")
      }  

# get list of grobs in current graphics window
grobs <- grid.ls(print=FALSE)  

# find segments grob for the arrows
s_id <- grobs$name[grep("segments", grobs$name)]

# edit length and colour of lines
seg <- grid.get(gPath(s_id[2]))     
grid.edit(gPath(s_id[2]),  
            x1=f(seg$x0, seg$x1, 2), 
            y1=f(seg$y0, seg$y1, 2),
            gp=gpar(col="red"))


# find text grob for the arrow labels
lab_id <- grobs$name[grep("text", grobs$name)]

# edit position of text, and rotate and colour labels
seg2 <- grid.get(gPath(lab_id)) 
grid.edit(gPath(lab_id),  
            x=f(seg$x0, seg2$x, 2), 
            y=f(seg$y0, seg2$y, 2),
            rot=0,
            gp=gpar(col="red"))

введите здесь описание изображения

Субъективно, если это делает его лучше, и, возможно, проще просто использовать biplot() или даже определить новую функцию

person user20650    schedule 27.05.2015
comment
спасибо за ваши усилия, «мне понравился ваш ответ, и я принимаю его - person Best; 28.05.2015