Матрица диаграммы рассеяния с логарифмическими осями в R

Я пытаюсь создать матрицу диаграммы рассеяния из своего набора данных, чтобы в результирующей матрице:

  • У меня есть две разные группы, основанные на
    • Четверть года (выделена цветами точек)
    • Тип дня (форма точек, указывающая, является ли это выходным или обычным днем ​​между понедельником и пятницей)
  • Логарифмические -масштабированные оси x и y.
  • Значения на метках осей не являются логарифмическими, т. е. значения должны отображаться на осях как целые числа от 0 до 350, а не их эквиваленты log10.
  • Верхняя панель имеет значения корреляции для каждого квартала.

До сих пор я пытался использовать функции:

  1. пары()
  2. ggpairs ()[из пакета GGally]
  3. матрица рассеяния()
  4. сплом()

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

  • С парами ()я могу создать матрицу диаграммы рассеяния,но параметр log="xy" как-то убирает имена переменных из диагонали результирующей матрицы.
  • ggpairs ()не поддерживает логарифмические шкалы напрямую, но я создал функцию, которая проходит через диагональ и нижнюю плоскость матрицы диаграммы рассеяния на основе этого ответа. Хотя логарифмическое масштабирование работает на более низком уровне, оно искажает метки переменных и отметки значений.

Функция создается и используется следующим образом:

ggpairs_logarithmize <- function(a) { # parameter a is a ggpairs sp-matrix
        max_limit <- sqrt(length(a$plots))
        for(row in 1:max_limit) { # index 1 is used to go through the diagonal also
                for(col in j:max_limit) {
                        subsp <- getPlot(a,row,col)
                        subspnew <- subsp + scale_y_log10() + scale_x_log10()
                        subspnew$type <- 'logcontinous'
                        subspnew$subType <- 'logpoints'
                        a <- putPlot(a,subspnew,row,col)
                }
        }
        return(a)
}
scatplot <- ggpairs(...)
scatplot_log10 <- ggpairs_logarithmize(scatplot)
scatplot_log10
  • scatterplotMatrix (), похоже, не поддерживает две группы. Я смог сделать это отдельно для сезона и типа дня, но мне нужны обе группы на одном графике.
  • splom ()каким-то образом помечает значения отметок оси также как логарифмические значения, и их следует оставить такими, как они есть (между целыми числами от 0 до 350 ).

Существуют ли какие-либо простые решения для создания матрицы диаграммы рассеяния с логарифмическими осями с учетом моих требований?

РЕДАКТИРОВАТЬ (13.7.2012):Были запрошены примерные данные и выходные данные. Вот несколько фрагментов кода для создания демонстрационного набора данных:

Объявить необходимые функции

logarithmize <- function(a)
{
        max_limit <- sqrt(length(a$plots))
        for(j in 1:max_limit) {
                for(i in j:max_limit) {
                        subsp <- getPlot(a,i,j)
                        subspnew <- subsp + scale_y_log10() + scale_x_log10()
                        subspnew$type <- 'logcontinous'
                        subspnew$subType <- 'logpoints'
                        a <- putPlot(a,subspnew,i,j)
                }
        }
        return(a)
}

add_quarters <- function(a,datecol,targetcol) {
    for(i in 1:nrow(a)) {
        month <- 1+as.POSIXlt(as.Date(a[i,datecol]))$mon
        if ( month <= 3 ) { a[i,targetcol] <- "Q1" }
        else if (month <= 6 && month > 3) { a[i,targetcol] <- "Q2" }
        else if ( month <= 9 && month > 6 ) { a[i,targetcol] <- "Q3" }
        else if ( month > 9 ) { a[i,targetcol] <- "Q4" }
    }
    return(a)
}

Создать набор данных:

days <- seq.Date(as.Date("2010-01-01"),as.Date("2012-06-06"),"day")
bananas <- sample(1:350,length(days), replace=T)
apples <- sample(1:350,length(days), replace=T)
oranges <- sample(1:350,length(days), replace=T)
weekdays <- c("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday")
fruitsales <- data.frame(Date=days,Dayofweek=rep(weekdays,length.out=length(days)),Bananas=bananas,Apples=apples,Oranges=oranges)
fruitsales[5:6,"Quarter"] <- NA
fruitsales[6:7,"Daytype"] <- NA
fruitsales$Daytype <- fruitsales$Dayofweek
levels(fruitsales$Daytype) # Confirm the day type levels before assigning new levels
levels(fruitsales$Daytype) <- c("Casual","Casual","Weekend","Weekend","Casual","Casual","Casual
")
fruitsales <- add_quarters(fruitsales,1,6)

Выполните (ПРИМЕЧАНИЕ! Пользователи Windows/Mac, измените x11 ()в зависимости от того, какая у вас ОС)

# install.packages("GGally")
require(GGally)
x11(); ggpairs(fruitsales,columns=3:5,colour="Quarter",shape="Daytype")
x11(); logarithmize(ggpairs(fruitsales,columns=3:5,colour="Quarter",shape="Daytype"))

8
задан Community 23 May 2017 в 10:34
поделиться