Как построить в R коррелограмму поверх корреляционной матрицы?

Я следовал инструкциям на этом веб-сайте от STHDA для построения корреляционных матриц и коррелограмм в R. Веб-сайт и примеры действительно хороши. Однако я хотел бы построить верхнюю часть коррелограммы над верхней частью матрицы корреляции.

Вот код:

library(PerformanceAnalytics)
chart.Correlation(mtcars, histogram=TRUE, pch=19)

Это должно дать мне корреляционную матрицу с использованием точечных диаграмм вместе с гистограммой, которую я хотел бы сохранить. Но для верхней части графика я хотел бы получить коррелограмму из этого кода:

library(corrplot)
corrplot(cor(mtcars), type="upper", order="hclust", tl.col="black", tl.srt=45)

Очевидный способ сделать это — экспортировать все графики в pdf, а затем работать с Inkscape, но было бы лучше, если бы я мог получить это непосредственно из R. Есть ли какой-либо способ сделать это?

Спасибо.


person RodGob    schedule 29.07.2015    source источник
comment
Объединить два подобных сюжета может быть сложнее, чем просто воссоздать их самостоятельно. Ознакомьтесь с ?pairs, особенно с lower.panel, diag.panel и upper.panel; это позволит вам воссоздать все, кроме градиентной полосы справа (которую вы можете воссоздать множеством способов).   -  person r2evans    schedule 30.07.2015
comment
Спасибо, кажется, это действительно работает красиво и проще. Однако у меня возникают проблемы с созданием кругов, как показано на corrplot (цвет и размер зависят от значений корреляции) - например, я их просто не получаю. И будет ли legend() одним из вариантов градиентной панели? Ваше здоровье!   -  person RodGob    schedule 31.07.2015
comment
Круги можно легко сделать с помощью одного из символов pch в пределах text, свободно контролируя его радиус с помощью cex, но это немного неаккуратно и неточно. Я не думаю, что в базовой графике R есть автоматический круг, и хотя некоторые вспомогательные пакеты могут сделать это за вас, я часто просто прибегаю к паре вызовов polygon или line и sin/cos, возвращая ко временам базовой тригонометрии. legend не может сделать такую ​​цветовую полосу.   -  person r2evans    schedule 31.07.2015
comment
Если вы ищете (в Google, а также в SO) цветовой градиент легенды R, вы можете найти несколько рабочих примеров.   -  person r2evans    schedule 31.07.2015
comment
Привет, я пробовал что-то вроде: panel.cor <- function(w, z, ...) { usr <- par("usr"); on.exit(par(usr)); par(usr = c(0, 1, 0, 1)); abs.r <- abs(cor(w, z)); pts = seq(0, 2 * pi, length.out = 100); xy = cbind(0.5 + abs.r * sin(pts), 0.5 + abs.r * cos(pts)); SpatialPolygons(list(Polygons(list(Polygon(xy)), "polygon"))); } К сожалению, это не работает. Честно говоря, я не на 100% знаком с функциями в R. Я думаю, что эта функция не работает, потому что она не находит центр каждого графика, но я не уверен. Не могли бы вы помочь? Ваше здоровье!   -  person RodGob    schedule 07.08.2015
comment
Во-первых, при уточнении вашего вопроса (или после того, как вы что-то попробовали), особенно при предоставлении кода, вам действительно следует отредактировать исходный вопрос и опубликовать его там; это делает его более читабельным. Во-вторых, когда я говорю легко, я никогда не думал, что это приведет к SpatialPolygons, которые (на мой взгляд) здесь значительно излишни. (Почему бы просто не использовать lines и/или polygon?)   -  person r2evans    schedule 07.08.2015
comment
Спасибо за информацию! В следующий раз я отредактирую свой вопрос! Живя и учась...   -  person RodGob    schedule 07.08.2015


Ответы (1)


Хитрость использования функций панели в pairs находится в help(pairs):

Функция панели не должна пытаться начать новый график, а должна просто строить график в заданной системе координат: таким образом, «график» и «блочный график» не являются функциями панели.

Таким образом, вы должны использовать графические функции добавления, такие как points, lines, polygon или, возможно, (если доступно) plot(..., add=TRUE), но не прямой график. То, что вы предлагали в своем комментарии (с SpatialPolygons), могло бы сработать с некоторым подталкиванием, если бы вы на самом деле пытались построить его на тисках устройства, просто возвращая его из своей функции построения графика.

В приведенном ниже примере я на самом деле «создаю новый график», но я обманываю (на основе этот пост SO), добавив второй график поверх уже существующего. Я делаю это, чтобы сократить необходимый в противном случае масштаб/сдвиг, который все равно не будет идеальным, поскольку вам, кажется, нужен «идеальный круг», что на самом деле может быть гарантировано только с asp=1 (соотношение сторон фиксировано на 1: 1).

colorRange <- c('#69091e', '#e37f65', 'white', '#aed2e6', '#042f60')
## colorRamp() returns a function which takes as an argument a number
## on [0,1] and returns a color in the gradient in colorRange
myColorRampFunc <- colorRamp(colorRange)

panel.cor <- function(w, z, ...) {
    correlation <- cor(w, z)

    ## because the func needs [0,1] and cor gives [-1,1], we need to
    ## shift and scale it
    col <- rgb( myColorRampFunc( (1+correlation)/2 )/255 )

    ## square it to avoid visual bias due to "area vs diameter"
    radius <- sqrt(abs(correlation))
    radians <- seq(0, 2*pi, len=50)     # 50 is arbitrary
    x <- radius * cos(radians)
    y <- radius * sin(radians)
    ## make them full loops
    x <- c(x, tail(x,n=1))
    y <- c(y, tail(y,n=1))

    ## I trick the "don't create a new plot" thing by following the
    ## advice here: http://www.r-bloggers.com/multiple-y-axis-in-a-r-plot/
    ## This allows
    par(new=TRUE)
    plot(0, type='n', xlim=c(-1,1), ylim=c(-1,1), axes=FALSE, asp=1)
    polygon(x, y, border=col, col=col)
}

pairs(mtcars, upper.panel=panel.cor)

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

Вы можете манипулировать размером кругов — за счет беспристрастной визуализации — играя с радиусом. Цвета я взял прямо со страницы, на которую вы изначально ссылались.

Аналогичные функции можно использовать для нижних и диагональных панелей.

person r2evans    schedule 07.08.2015
comment
Это было здорово, большое спасибо за помощь и объяснение! - person RodGob; 07.08.2015
comment
См. мое редактирование для правильной обработки визуального смещения. Упс. - person r2evans; 07.08.2015