5

特定の列に指定された値に応じて、ggplot2 ファセット プロットの背景を色付けしたいと考えています。すでに尋ねた以前の質問への回答を使用して、必要なものをまとめることができました. この質問に対する@joranの回答は、ggplotに渡す別のデータフレームを作成する手法を示しているため、特に役立ちました。

これはすべてうまく機能し、次の画像に示す出力が得られます。 地域ごとに色分けされたファセット

上記のプロットを生成するために使用したコードは次のとおりです。

# User-defined variables go here

list_of_names <- c('aa','bb','cc','dd','ee','ff')
list_of_regions <- c('europe','north america','europe','asia','asia','japan')

# Libraries

require(ggplot2)
require(reshape)

# Create random data with meaningless column names
set.seed(123)
myrows <- 30
mydf <- data.frame(date = seq(as.Date('2012-01-01'), by = "day", length.out = myrows),
                   aa = runif(myrows, min=1, max=2),
                   bb = runif(myrows, min=1, max=2),
                   cc = runif(myrows, min=1, max=2),
                   dd = runif(myrows, min=1, max=2),
                   ee = runif(myrows, min=1, max=2),
                   ff = runif(myrows, min=1, max=2))

# Transform data frame from wide to long

mydf <- melt(mydf, id = c('date'))
mydf$region <- as.character("unassigned")

# Assign regional label

for (ii in seq_along(mydf$date)) {
    for (jj in seq_along(list_of_names)) {
        if(as.character(mydf[ii,2]) == list_of_names[jj]) {mydf$region[ii] <- as.character(list_of_regions[jj])}
    }
}

# Create data frame to pass to ggplot for facet colours
mysubset <- unique(mydf[,c('variable','region')])
mysubset$value <- median(mydf$value) # a dummy value but one within the range used in the data frame
mysubset$date <- as.Date(mydf$date[1]) # a dummy date within the range used

# ... And plot
p1 <- ggplot(mydf, aes(y = value, x = date, group = variable)) +
    geom_rect(data = mysubset, aes(fill = region), xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf, alpha = 0.3) +
    scale_fill_manual(values = c("japan" = "red", "north america" = "green", "asia" = "orange", "europe" = "blue")) +
    geom_line() +
    facet_wrap( ~ variable, ncol = 2)

print (p1)

私が取り組んでいる実際のスクリプトは、さまざまなデータ系列を含むさまざまなグループに使用することを目的としているため、このスクリプトは何度も複製され、変数のみが変更されます。

これにより、ユーザー定義の要素を編集のために明確にアクセスできるようにすることが重要になります。そのため、list_of_namesおよびlist_of_regions変数がファイルの先頭に配置されます。(もちろん、スクリプトをまったく変更する必要はなく、これらのリストを外部ファイルとして定義するか、引数としてスクリプトに渡す方がよいでしょう。) これら 2 つのforループを使用して領域を割り当てることにより、ソリューションを一般化しようとしました。 . 関数を使用してよりR中心のソリューションを取得しようとしばらくいじりましたが、apply機能させることができなかったため、あきらめて、知っていることに固執しました。

ただし、私のコードでは、現状では、scale_fill_manual呼び出しに変数を明示的に渡して、'europe' = 'blue'. これらの変数は、処理しているデータによって異なるため、現在の形式のスクリプトでは、データ系列のグループごとにスクリプトの ggplot 部分を手動で編集する必要があります。これには時間がかかることは承知しており、エラーも非常に発生しやすいと強く思います。

Q. 理想的には、以前に宣言された色のリストに一致する、以前に宣言されたscale_fill_manual値のリスト (この場合は ) から呼び出しに必要な値をプログラムで抽出して定義できるようにしたいのですが、list_of_regionsこれを達成する方法。あなたはなにか考えはありますか?

4

1 に答える 1

5

これは役に立ちますか?

cols <- rainbow(nrow(mtcars))
mtcars$car <- rownames(mtcars)

ggplot(mtcars, aes(mpg, disp, colour = car)) + geom_point() +
  scale_colour_manual(limits = mtcars$car, values = cols) +
  guides(colour = guide_legend(ncol = 3))

ここに画像の説明を入力

于 2012-04-22T12:06:31.817 に答える