Преобразование вывода corpplot в grob - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь использовать grid.arrange для объединения нескольких типов графиков / таблиц, одним из которых является корреляционная матрица, использующая corrplot.Есть ли способ преобразовать corpplot в grob или экспортировать / импортировать как изображение, совместимое с grid.arrange?Поскольку другие графики, которые я объединяю, взяты из ggplot и tableGrob, я не могу использовать par(mfrow = c(2, 2)) или layout(matrix(1:2)), как предлагается в других публикациях.

P1 <- corrplot(PANAcor, order="hclust", addgrid.col = "gray",  
               type="full", col = col2(50), tl.cex=1.5, tl.col="black", 
               method="color", tl.pos="lt", tl.srt=45, hclust.method = "average",
               cl.ratio = 0.25, cl.align = "l", number.cex = 2)

summary <- grid.arrange(
    top=textGrob(sprintf("%s Summary",subject), gp=gpar(fontsize=16,font=8)),
    blank, P1, P2,
    blank, T1, T2,
    ncol=3, widths = c(0.1, 3, 3), 
    nrow=2, heights= c(1, 1),
    bottom = textGrob(sprintf("%s run %s",version,runtime), 
    gp=gpar(fontsize=6,font=8), hjust=-1)
  )

Ошибка в gList (list (1, 0,45, 0,62, 0,55, 0,68, 0,64, -0,13, -0,37, -0,22: в gList разрешены только 'grobs'). Дополнительно: предупреждающее сообщение: In grob $ wrapvp <- vp: принудительное выполнение LHS длясписок </p>

Данные:

PANAcor <- structure(c(1, 0.56, 0.68, -0.49, -0.4, -0.39, 0.56, 1, 0.64, -0.55, 
                       -0.49, -0.54, 0.68, 0.64, 1, -0.69, -0.57, -0.65, -0.49,
                       -0.55, -0.69, 1, 0.82, 0.73, -0.4, -0.49, -0.57, 0.82, 1, 
                       0.71, -0.39, -0.54, -0.65, 0.73, 0.71, 1), 
                     .Dim = c(6L, 6L), 
                     .Dimnames = list(c("Anxious", "Irritable", "Upset", "Happy",
                                        "Enthusiastic", "Outgoing"), 
                                      c("Anxious", "Irritable", "Upset", "Happy", 
                                        "Enthusiastic", "Outgoing"))) 

col2 <- colorRampPalette(c("#7bffff","#7bbdff","#0000ff","black",
                           "#ff1a1a","#ff8000","#ffff4d"))

1 Ответ

0 голосов
/ 12 декабря 2018

grid.echo + grid.grab из пакета gridGraphics преобразует рисунок, нарисованный corrplot, в идентично выглядящий гроб.Проблема в том, что гроб выглядит одинаково только при точно таком же размере графического устройства.

Воспроизведение проблемы :

library(gridGraphics)
library(grid)

corrplot(PANAcor, order="hclust", addgrid.col = "gray",  
         type="full", col = col2(50), tl.cex=1.5, tl.col="black", 
         method="color", tl.pos="lt", tl.srt=45, hclust.method = "average",
         cl.ratio = 0.25, cl.align = "l", number.cex = 2)

## grab the scene as a grid object & save it to P1
grid.echo()
P1 <- grid.grab()

grid.draw(P1) # looks fine, until you resize the graphics device

Размер оригинала (выглядит идентично сгенерированной графикена corrplot:

original size looks fine

Больший размер (цветные области остаются квадратными, даже если матрица расширена до прямоугольных ячеек и не расширяется докрай каждой ячейки):

larger size with squares that don't cover the matrix

Меньший размер (цветные области имеют минимальную высоту / ширину, что приводит к их выплескиванию за пределы границкаждая клетка):

smaller size with squares that spill out

И если мы соберем несколько гробов вместе, это почти наверняка будет выглядеть странно:

library(gridExtra)
grid.arrange(P1, P1, P1, layout_matrix = matrix(c(1, 1, 2, 3), nrow = 2, ncol = 2))

arranging 3 plots together

Короче говоря, из-за того, как corrplot рисует графику, все другие дочерние объекты в P1 синхронизируются при изменении размера графического устройства, за исключениемГроб отвечает за цвет.

Решение :

# save correlation matrix colors to a vector, then make coloured matrix grob transparent
matrix.colors <- getGrob(P1, gPath("square"), grep = TRUE)[["gp"]][["fill"]]
P1 <- editGrob(P1,
               gPath("square"), grep = TRUE,
               gp = gpar(col = NA,
                         fill = NA))

# apply the saved colours to the underlying matrix grob
P1 <- editGrob(P1,
               gPath("symbols-rect-1"), grep = TRUE,
               gp = gpar(fill = matrix.colors))

# convert the background fill from white to transparent, while we are at it
P1 <- editGrob(P1,
               gPath("background"), grep = TRUE,
               gp = gpar(fill = NA))

Заменить gPath("square") с gPath("circle"), если вы используете corrplot метод по умолчанию.Я не проверял другие варианты методов для соответствующих имен гробов, но общий принцип должен быть похожим.

Убедитесь, что все выровнено сейчас :

grid.arrange(P1, P1, P1, layout_matrix = matrix(c(1, 1, 2, 3), nrow = 2, ncol = 2))

arranging 3 plots together after applying solution

Кстати, вы можете настроить аргументы размера текста в corrplot.Исходя из вашего текущего кода, метки выглядят довольно большими, и их можно обрезать, когда вы размещаете несколько графиков вместе.

...