8

データセットから散布図行列を作成しようとしています。その結果、行列は次のようになります。

  • 私はに基づいて2つの異なるグループを持っています
    • 今年の四半期(ポイントの色として区別されます)
    • 日タイプ(ポイントの形は、月曜日から金曜日までの週末またはカジュアルな日を示します)
  • 対数スケールのx軸とy軸。
  • 軸目盛りラベルの値は対数ではありません。つまり、値は、log10の対応物ではなく、0〜350の整数として軸に表示する必要があります。
  • 上のパネルには、四半期ごとの相関値があります。

これまで、関数を使用してみました。

  1. ペア()
  2. ggpairs()[GGallyパッケージから]
  3. scatterplotMatrix()
  4. splom()

しかし、私はこれらのパッケージでまともな結果を得ることができませんでした、そして毎回私の要件の1つ以上が欠けているようです。

  • pair()を使用すると、散布図行列を作成できますが、パラメーター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()は2つのグループ化をサポートしていないようです。これは季節と日タイプで別々に行うことができましたが、同じプロットに両方のグループが必要です。
  • 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ユーザー、使用しているOSに応じて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"))
4

1 に答える 1

4

の問題pairsは、ログ座標系でのユーザー座標の使用に起因します。pairs具体的には、対角線にラベルを追加する場合、

par(usr = c(0, 1, 0, 1))

ただし、を介してログ座標系を指定する場合、log = "xy"ここで必要なのは

par(usr = c(0, 1, 0, 1), xlog = FALSE, ylog = FALSE) 

Rヘルプに関するこの投稿を参照してください。

これは、次の解決策を示唆しています(問題のデータを使用)。

## adapted from panel.cor in ?pairs
panel.cor <- function(x, y, digits=2, cex.cor, quarter, ...)
{
  usr <- par("usr"); on.exit(par(usr))
  par(usr = c(0, 1, 0, 1), xlog = FALSE, ylog = FALSE)
  r <- rev(tapply(seq_along(quarter), quarter, function(id) cor(x[id], y[id])))
  txt <- format(c(0.123456789, r), digits=digits)[-1]
  txt <- paste(names(txt), txt)
  if(missing(cex.cor)) cex.cor <- 0.8/strwidth(txt)
  text(0.5, c(0.2, 0.4, 0.6, 0.8), txt)
}

pairs(fruitsales[,3:5], log = "xy", 
      diag.panel = function(x, ...) par(xlog = FALSE, ylog = FALSE),
      label.pos = 0.5,
      col = unclass(factor(fruitsales[,6])), 
      pch = unclass(fruitsales[,7]), upper.panel = panel.cor, 
      quarter = factor(fruitsales[,6]))

これにより、次のプロットが生成されます

ペアは対数座標系にプロットします

于 2012-07-13T16:02:41.173 に答える