Как я могу создать эту диаграмму. График корреляции в R с помощью пакета ggplot2?

Я бы очень хотел воссоздать этот график, используя чистый подход ggplot2, так как я хотел бы решить все свои построения с использованием этого пакета.

Сюжет, который я хотел бы воссоздать с помощью пакета ggplot2

Код для создания этого конкретного графика приведен ниже.

library(PerformanceAnalytics)
library(quantmod)
getSymbols(c('SPY','LQD','GLD'))
Data <- cbind(Cl(SPY),Cl(LQD),Cl(GLD))
Year <- as.factor(format(index(Data),'%Y'))
chart.Correlation(Data,bg=seq(1:5)[Year],pch=21)
par(xpd=TRUE)
legend(0, 1, as.vector(unique(Year)), fill=seq(1:5))

Подробнее об этом можно прочитать на этом сайте .

Я создал небольшой набор данных, с которым можно поиграть. Следующий код определяет data.frame и преобразует его в формат, который обычно нравится ggplot.

library(ggplot2)
library(reshape2)
mydf<-structure(list(SPY = c(141.37, 141.67, 140.54, 141.19, 141.07, 
                   141.54, 142.16, 143.24, 142.96, 143.02, 142.54, 142.82, 142.38, 
                   142.8, 143.95, 142.26, 142.13, 142.05, 142.79, 143.75, 144.86, 
                   141.31, 141.19, 138.91, 140.37, 141.29, 140.15, 141.28, 138.17, 
                   136.98, 133.43, 132.06, 130.72, 133.86, 134.99, 133.04, 135.24, 
                   135.91, 134.91, 137.37, 92.96, 92.85, 93.47, 90.67, 91.04, 89.09, 
                   86.95, 87.11, 84.37, 84.4, 85.06, 80.57, 84.05, 82.75, 83.11, 
                   83.68, 84.53, 87.39, 84.55, 82.83), 
           LQD = c(106.45, 107.25, 107.19, 107.15, 107.17, 107.03, 106.7, 106.59, 
                   106.71, 106.56, 106.87, 
                   106.81, 106.88, 106.59, 106.64, 106.3, 106.23, 106.18, 106.33, 
                   106.78, 105.73, 106.6, 106.47, 106.27, 106.05, 105.74, 106.51, 
                   106.07, 106.64, 106.48, 106.98, 106.8, 107.03, 107.17, 106.26, 
                   107.41, 107.38, 107.2, 107.18, 107.53, 100.61, 101.3, 101.47, 
                   100.62, 101.34, 102.6, 102.07, 101.85, 101.4, 101.6, 101.6, 100.1, 
                   99.6, 99.23, 98.57, 97.69, 99.53, 100.32, 99.12, 99.82), 
           GLD = c(62.28, 61.65, 60.17, 60.48, 60.85, 60.59, 60.63, 62.17, 61.97, 62.64, 
                   62.26, 63, 62.72, 64.23, 64.33, 64.06, 64.17, 63.77, 64.22, 64.83, 
                   85.57, 85.13, 84.77, 86.78, 86.55, 88.25, 88.58, 89.54, 87.99, 
                   86.7, 86.5, 87.42, 88.17, 87.89, 90.08, 90.3, 91.75, 91.15, 92.06, 
                   91.4, 86.23, 84.48, 85.13, 82.75, 84.46, 83.92, 80.76, 80.88, 
                   79.79, 80.39, 82.71, 84.52, 84.15, 84.58, 88.53, 88.95, 88.38, 
                   87.42, 89.5, 91.31), 
           Year = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
                              1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
                              2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
                              2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
                              3L, 3L, 3L, 3L, 3L, 3L), 
                            .Label = c("2007", "2008", "2009"), 
                            class = "factor")), 
      .Names = c("SPY", "LQD", "GLD", "Year"), 
      row.names = c("2007-01-02", "2007-01-03", 
                    "2007-01-04", "2007-01-07", "2007-01-08", "2007-01-09", "2007-01-10", 
                    "2007-01-11", "2007-01-15", "2007-01-16", "2007-01-17", "2007-01-18", 
                    "2007-01-21", "2007-01-22", "2007-01-23", "2007-01-24", "2007-01-25", 
                    "2007-01-28", "2007-01-29", "2007-01-30", "2008-01-02", "2008-01-03", 
                    "2008-01-06", "2008-01-07", "2008-01-08", "2008-01-09", "2008-01-10", 
                    "2008-01-13", "2008-01-14", "2008-01-15", "2008-01-16", "2008-01-17", 
                    "2008-01-21", "2008-01-22", "2008-01-23", "2008-01-24", "2008-01-27", 
                    "2008-01-28", "2008-01-29", "2008-01-30", "2009-01-01", "2009-01-04", 
                    "2009-01-05", "2009-01-06", "2009-01-07", "2009-01-08", "2009-01-11", 
                    "2009-01-12", "2009-01-13", "2009-01-14", "2009-01-15", "2009-01-19", 
                    "2009-01-20", "2009-01-21", "2009-01-22", "2009-01-25", "2009-01-26", 
                    "2009-01-27", "2009-01-28", "2009-01-29"), 
      class = "data.frame")
mydf<-data.frame(ID=rownames(mydf), mydf)
moltdf<-melt(mydf)

Теперь я знаю, что этот moltdf можно передать в ggplot, но я понятия не имею, как сгенерировать различные сегменты на довольно информативном графике выше.


person Dr. Mike    schedule 10.12.2012    source источник
comment
Я пробовал этот подход (theatavism.blogspot.dk/2009/ 05 /), но это не то, что мне нужно. Я хочу именно тот сюжет, который изображен на прикрепленном изображении. Я понятия не имею, как создать это в ggplot2. Отсюда мой вопрос.   -  person Dr. Mike    schedule 10.12.2012
comment
Если вам нужен именно этот сюжет, я действительно не понимаю, почему вы хотите использовать ggplot2. Просто ради использования ggplot2?   -  person Roland    schedule 10.12.2012
comment
Мне очень хочется опубликовать решение, и я могу укусить, если вы выполните базовую работу по переносу данных во фрейм данных, готовых к обработке и передаче в ggplot.   -  person Andrie    schedule 10.12.2012
comment
Я хочу единообразия в разрабатываемом мной пакете. Мне нужна только одна зависимость библиотеки построения графиков. Мой пакет довольно большой, и я не хочу вводить другую зависимость.   -  person Dr. Mike    schedule 10.12.2012
comment
@ Андрей Я определенно сделаю это. :) Я выложу, когда закончу.   -  person Dr. Mike    schedule 10.12.2012
comment
Если вы не хотите загружать PerformanceAnalytics, почему бы просто не использовать базовую графику? Функция chart.Correlation - это лишь слегка приукрашенная версия кода из example(pairs), которая также доступна здесь < / а>   -  person GSee    schedule 10.12.2012
comment
@GSee Да, это именно то, что я хочу. Но для моего пакета важно, чтобы внешний вид создаваемых им графиков был единообразным. Поэтому я хотел бы сделать это с помощью ggplot2. Теперь, если это невозможно сделать в ggplot2 или есть веские теоретические причины не делать этого, я приму поражение и вместо этого воспользуюсь функцией пар из базового пакета. Мне просто кажется немного странным, что ggplot2 не может это воссоздать. Но опять же, я мало знаю о возможностях и / или ограничениях пакета ggplot2. Я новичок.   -  person Dr. Mike    schedule 11.12.2012
comment
Вы можете воссоздать это, используя ggplot2. Но объем работы просто делает разумным добавить еще одну зависимость к вашему и так уже большому пакету, не так ли?   -  person PavoDive    schedule 27.04.2019


Ответы (2)


Я думаю, вам здесь понадобится ggpairs - возможно, с некоторыми дополнительными настройками. Пример:

> library(GGally)
> ggpairs(mtcars)

простая демонстрация ggpairs


Обновление: на основе обновленного вопроса с добавленными данными:

> ggpairs(mydf[, 2:5])

ggpairs на mydf

person daroczig    schedule 10.12.2012
comment
Действительно интересная упаковка, которая позволяет представить почти ту же информацию. Но должен признать, что мне больше нравится презентация, созданная функцией chart.Correlation. - person Dr. Mike; 10.12.2012

person    schedule
comment
Добро пожаловать в SO. И особенно спасибо за ответ. Я бы посоветовал вам подумать о том, чтобы еще немного обогатить его. Здесь вы рискуете получить много голосов против. OP спросил: мне нужна альтернатива ggplot для PerformanceAnalytics, но вы просто предоставляете решение PerformanceAnalytics, почти идентичное тому, которое опубликовано в вопросе. На самом деле это не ответ. - person PavoDive; 27.04.2019