web-dev-qa-db-ja.com

安定したマッピングを持つggplot2のカテゴリ変数に色を割り当てる方法は?

私は先月、Rに精通しています。

ここに私の質問があります:

安定したマッピングを持つggplot2のカテゴリ変数に色を割り当てる良い方法は何ですか?サブセットとカテゴリ変数の数が異なるグラフのセット全体で一貫した色が必要です。

例えば、

plot1 <- ggplot(data, aes(xData, yData,color=categoricaldData)) + geom_line()

ここで、categoricalDataには5つのレベルがあります。

その後

plot2 <- ggplot(data.subset, aes(xData.subset, yData.subset, 
                                 color=categoricaldData.subset)) + geom_line()

categoricalData.subsetには3つのレベルがあります。

ただし、両方のセットにある特定のレベルは異なる色になり、グラフを一緒に読むのが難しくなります。

データフレームに色のベクトルを作成する必要がありますか?または、特定の色をカテゴリに割り当てる別の方法はありますか?

152
wintour

OPの正確な例のような単純な状況では、Thierryの答えが最高であることに同意します。ただし、単一の大きなデータフレームをサブセット化することですべてのnotである複数のデータフレームにわたって一貫したカラースキームを維持しようとする場合に、より簡単になる別のアプローチを指摘すると便利だと思います。複数のデータフレームの因子レベルを管理することは、それらが別々のファイルから取得され、すべての因子レベルが各ファイルに表示されない場合、退屈になる可能性があります。

これに対処する1つの方法は、次のようにカスタムの手動カラースケールを作成することです。

#Some test data
dat <- data.frame(x=runif(10),y=runif(10),
        grp = rep(LETTERS[1:5],each = 2),stringsAsFactors = TRUE)

#Create a custom color scale
library(RColorBrewer)
myColors <- brewer.pal(5,"Set1")
names(myColors) <- levels(dat$grp)
colScale <- scale_colour_manual(name = "grp",values = myColors)

次に、必要に応じてプロットにカラースケールを追加します。

#One plot with all the data
p <- ggplot(dat,aes(x,y,colour = grp)) + geom_point()
p1 <- p + colScale

#A second plot with only four of the levels
p2 <- p %+% droplevels(subset(dat[4:10,])) + colScale

最初のプロットは次のようになります。

enter image description here

2番目のプロットは次のようになります。

enter image description here

このように、各データフレームを覚えたりチェックしたりする必要はありません。適切なレベルがあることを確認してください。

160
joran

malcook in his comment によって指摘された同じ状況にあります:残念ながら answer by Thierry は機能しませんggplot2バージョン0.9.3.1で。

png("figure_%d.png")
set.seed(2014)
library(ggplot2)
dataset <- data.frame(category = rep(LETTERS[1:5], 100),
    x = rnorm(500, mean = rep(1:5, 100)),
    y = rnorm(500, mean = rep(1:5, 100)))
dataset$fCategory <- factor(dataset$category)
subdata <- subset(dataset, category %in% c("A", "D", "E"))

ggplot(dataset, aes(x = x, y = y, colour = fCategory)) + geom_point()
ggplot(subdata, aes(x = x, y = y, colour = fCategory)) + geom_point()

これが最初の図です:

ggplot A-E, mixed colors

2番目の図:

ggplot ADE, mixed colors

Eがマゼンタからブルーに切り替わるなど、色が固定されないことがわかります。

malcook in his comment と、- hadley in his comment で示唆されているように、limitsを使用するコードは正常に動作します。

ggplot(subdata, aes(x = x, y = y, colour = fCategory)) +       
    geom_point() + 
    scale_colour_discrete(drop=TRUE,
        limits = levels(dataset$fCategory))

正しい次の図を示します。

correct ggplot

これは、sessionInfo()からの出力です。

R version 3.0.2 (2013-09-25)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] methods   stats     graphics  grDevices utils     datasets  base     

other attached packages:
[1] ggplot2_0.9.3.1

loaded via a namespace (and not attached):
 [1] colorspace_1.2-4   dichromat_2.0-0    digest_0.6.4       grid_3.0.2        
 [5] gtable_0.1.2       labeling_0.2       MASS_7.3-29        munsell_0.4.2     
 [9] plyr_1.8           proto_0.3-10       RColorBrewer_1.0-5 reshape2_1.2.2    
[13] scales_0.2.3       stringr_0.6.2 
35

最も簡単な解決策は、サブセット化の前にカテゴリ変数を係数に変換することです。要するに、すべてのサブセットでまったく同じレベルの因子変数が必要です。

library(ggplot2)
dataset <- data.frame(category = rep(LETTERS[1:5], 100), 
    x = rnorm(500, mean = rep(1:5, 100)), y = rnorm(500, mean = rep(1:5, 100)))
dataset$fCategory <- factor(dataset$category)
subdata <- subset(dataset, category %in% c("A", "D", "E"))

文字変数付き

ggplot(dataset, aes(x = x, y = y, colour = category)) + geom_point()
ggplot(subdata, aes(x = x, y = y, colour = category)) + geom_point()

因子変数あり

ggplot(dataset, aes(x = x, y = y, colour = fCategory)) + geom_point()
ggplot(subdata, aes(x = x, y = y, colour = fCategory)) + geom_point()
19
Thierry

Joranの非常に役立つ回答に基づいて、ブールファクター(TRUEFALSE)の安定したカラースケールを得るためのこのソリューションを思いつくことができました。

boolColors <- as.character(c("TRUE"="#5aae61", "FALSE"="#7b3294"))
boolScale <- scale_colour_manual(name="myboolean", values=boolColors)

ggplot(myDataFrame, aes(date, duration)) + 
  geom_point(aes(colour = myboolean)) +
  boolScale

ColorBrewerはバイナリカラースケールではあまり役に立たないため、必要な2色は手動で定義されます。

ここでmybooleanは、TRUE/FALSEファクターを保持するmyDataFrameの列の名前です。 dateおよびdurationは、この例のプロットのxおよびy軸にマップされる列名です。

14
Marian

これは古い投稿ですが、この同じ質問に対する答えを探していました。

次のようなものを試してみてください:

scale_color_manual(values = c("foo" = "#999999", "bar" = "#E69F00"))

カテゴリ値がある場合、これが機能しない理由はわかりません。

6