используйте ggpairs для создания этого сюжета

У меня есть код в приложении Shiny, который создает первый график ниже. Как видите, размер шрифта зависит от коэффициента корреляции. Я хотел бы создать нечто подобное с помощью ggpairs (GGally) или ggplot2. Второе изображение ниже было создано с помощью следующего кода:

library(GGally)
ggpairs(df, 
  upper = list(params = c(size = 10)),
  lower = list(continuous = "smooth", params = c(method = "loess", fill = "blue"))
)

Как видите, размер шрифта корреляции регулируется с помощью размера, но когда я устанавливаю вектор размеров, используется только первое значение. Я также хотел бы удалить «Corr:» и добавить индикатор значимости. Также было бы неплохо использовать цвета для знака коэффициента корреляции. На нижнем уровне method и fill не связаны с smooth. Любые предложения о том, как сделать так, чтобы второй сюжет отражал больше особенностей первого, были бы замечательными.

данные Anscombe:

df <- structure(list(y1 = c(8.04, 6.95, 7.58, 8.81, 8.33, 9.96, 7.24, 
4.26, 10.84, 4.82, 5.68), x1 = c(10L, 8L, 13L, 9L, 11L, 14L, 
6L, 4L, 12L, 7L, 5L), y2 = c(9.14, 8.14, 8.74, 8.77, 9.26, 8.1, 
6.13, 3.1, 9.13, 7.26, 4.74), x2 = c(10L, 8L, 13L, 9L, 11L, 14L, 
6L, 4L, 12L, 7L, 5L), y3 = c(7.46, 6.77, 12.74, 7.11, 7.81, 8.84, 
6.08, 5.39, 8.15, 6.42, 5.73), x3 = c(10L, 8L, 13L, 9L, 11L, 
14L, 6L, 4L, 12L, 7L, 5L)), .Names = c("y1", "x1", "y2", "x2", 
"y3", "x3"), class = "data.frame", row.names = c(NA, -11L))

график корреляции с использованием пар

# based mostly on http://gallery.r-enthusiasts.com/RGraphGallery.php?graph=137
panel.plot <- function(x, y) {
    usr <- par("usr"); on.exit(par(usr))
    par(usr = c(0, 1, 0, 1))
    ct <- cor.test(x,y)
    sig <- symnum(ct$p.value, corr = FALSE, na = FALSE,
                  cutpoints = c(0, 0.001, 0.01, 0.05, 0.1, 1),
                  symbols = c("***", "**", "*", ".", " "))
    r <- ct$estimate
    rt <- format(r, digits=2)[1]
    cex <- 0.5/strwidth(rt)

    text(.5, .5, rt, cex=cex * abs(r))
    text(.8, .8, sig, cex=cex, col='blue')
}
panel.smooth <- function (x, y) {
      points(x, y)
      abline(lm(y~x), col="red")
      lines(stats::lowess(y~x), col="blue")
}
pairs(df, lower.panel=panel.smooth, upper.panel=panel.plot)

график корреляции с использованием ggpairs


person Vincent    schedule 12.02.2014    source источник


Ответы (1)


Редактировать для GGally 1.0.1

Поскольку params устарел, используйте wrap так:

ggpairs(df[, 1:2], 
        upper = list(continuous = wrap("cor", size = 10)), 
        lower = list(continuous = "smooth"))

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

Оригинальный ответ

Настройка сложных графиков не всегда доступна через список параметров. Это естественно: нужно иметь в виду слишком много параметров. Так что единственный надежный вариант - изменить исходный код. Это особенно приятно, когда проект размещен на github.

Вот простая модификация для начала, сделанная в разветвленном репо . Самый простой способ обновить код и создать график ниже - скопировать и вставить функцию ggally_cor в вашу глобальную среду, а затем переопределить ту же функцию в пространстве имен GGally:

# ggally_cor <- <...>
assignInNamespace("ggally_cor", ggally_cor, "GGally")
ggpairs(df[, 1:2], 
        upper = list(params = c(size = 10)), 
        lower = list(continuous = "smooth"))

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

Я удалил текстовую метку и добавил индикаторы значимости. Однако изменить цвет и размер не так просто, поскольку они отображаются ранее. Я все еще думаю над этим, но вы поняли идею и можете перейти к дальнейшим настройкам.

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

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

person tonytonov    schedule 13.02.2014
comment
Я почти уверен, что возможен переменный размер и цвет. Более того, потребуется не более 10 строк кода, возможно, меньше. Единственное, что нужно сделать, - это переопределить существующее сопоставление. Я еще не знаю, как это сделать, но мне интересно узнать. Между тем, безусловно, стоит попробовать многогранный подход: он действительно может оказаться более подходящим путем. - person tonytonov; 13.02.2014
comment
Я задал вопрос здесь, это то, что мы нужно делать работу. - person tonytonov; 13.02.2014
comment
ты на несколько шагов впереди меня. Вы предлагаете сделать это в «обычном» ggplot или адаптировать сопоставления для ggpairs. Простой пример, на котором я могу опираться, был бы отличным. - person Vincent; 13.02.2014
comment
Немного поэкспериментирую, дам знать, как проходит. - person tonytonov; 13.02.2014
comment
Ознакомьтесь с ответом на вопрос, который я разместил; он показывает, как переопределить aes. - person tonytonov; 17.02.2014
comment
Как бы вы применили это сопоставление к ggpairs? - person Vincent; 18.02.2014
comment
Я так понимаю, что в GGally 1.0.1 должна использоваться функция wrap? - person Konrad; 16.02.2016
comment
@Konrad Спасибо за предложение. Я посмотрю, когда смогу, может быть, последнее обновление потребует некоторых изменений в предложенном мною решении. - person tonytonov; 16.02.2016
comment
@tonytonov Прекрасно работает с оберткой, и я это тестировал. Однако я не понимаю, как изменить используемую точную корреляцию. Я использую в контексте ggpairs, как показано выше. Любые идеи? - person boshek; 17.02.2016
comment
@boshek Спасибо, отредактировал свой ответ. Не уверен, что понимаю ваш вопрос. - person tonytonov; 17.02.2016
comment
@tonytonov Простите за тупость. Я имел ввиду какой тип корреляции. Копейщик? Пирсон? Итак, как это возможно сделать при указании такого вызова ggpairs(df[, 1:2], upper = list(params = c(size = 10)), lower = list(continuous = "smooth")) - person boshek; 17.02.2016