私は先月、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つのレベルがあります。
ただし、両方のセットにある特定のレベルは異なる色になり、グラフを一緒に読むのが難しくなります。
データフレームに色のベクトルを作成する必要がありますか?または、特定の色をカテゴリに割り当てる別の方法はありますか?
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
最初のプロットは次のようになります。
2番目のプロットは次のようになります。
このように、各データフレームを覚えたりチェックしたりする必要はありません。適切なレベルがあることを確認してください。
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()
これが最初の図です:
2番目の図:
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))
正しい次の図を示します。
これは、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
最も簡単な解決策は、サブセット化の前にカテゴリ変数を係数に変換することです。要するに、すべてのサブセットでまったく同じレベルの因子変数が必要です。
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()
Joranの非常に役立つ回答に基づいて、ブールファクター(TRUE
、FALSE
)の安定したカラースケールを得るためのこのソリューションを思いつくことができました。
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軸にマップされる列名です。
これは古い投稿ですが、この同じ質問に対する答えを探していました。
次のようなものを試してみてください:
scale_color_manual(values = c("foo" = "#999999", "bar" = "#E69F00"))
カテゴリ値がある場合、これが機能しない理由はわかりません。