Ggplot2: Как использовать одни и те же цвета на разных графиках для одного и того же фактора
Как я могу привязать один и тот же цвет к значению на разных участках?
Скажем, у меня есть два data.frames df1 и df2:
library(ggplot2)
library(gridExtra)
set.seed(1)
df1 <- data.frame(c=c('a', 'b', 'c', 'd', 'e'), x=1:5, y=runif(5))
df2 <- data.frame(c=c('a', 'c', 'e', 'g', 'h'), x=1:5, y=runif(5))
При построении их с использованием c в качестве индикатора цвета я получаю те же пять цветов.
g1 <- ggplot(df1, aes(x=x, y=y, fill=c)) + geom_bar(stat="identity")
g2 <- ggplot(df2, aes(x=x, y=y, fill=c)) + geom_bar(stat="identity")
grid.arrange(g1, g2, ncol=2)
![enter image description here]()
Но я хочу, чтобы те же значения c получали один и тот же цвет.
Ответы
Ответ 1
Теперь я написал функцию, которая генерирует другую функцию, которая вычисляет цвета. Я не уверен, что это хороший способ. Комментарии оценены.
library(ggplot2)
library(gridExtra)
library(RColorBrewer)
makeColors <- function(){
maxColors <- 10
usedColors <- c()
possibleColors <- colorRampPalette( brewer.pal( 9 , "Set1" ) )(maxColors)
function(values){
newKeys <- setdiff(values, names(usedColors))
newColors <- possibleColors[1:length(newKeys)]
usedColors.new <- c(usedColors, newColors)
names(usedColors.new) <- c(names(usedColors), newKeys)
usedColors <<- usedColors.new
possibleColors <<- possibleColors[length(newKeys)+1:maxColors]
usedColors
}
}
mkColor <- makeColors()
set.seed(1)
df1 <- data.frame(c=c('a', 'b', 'c', 'd', 'e'), x=1:5, y=runif(5))
df2 <- data.frame(c=c('a', 'c', 'e', 'g', 'h'), x=1:5, y=runif(5))
g1 <- ggplot(df1, aes(x=x, y=y, fill=c)) + geom_bar(stat="identity") + scale_fill_manual(values = mkColor(df1$c))
g2 <- ggplot(df2, aes(x=x, y=y, fill=c)) + geom_bar(stat="identity") + scale_fill_manual(values = mkColor(df2$c))
grid.arrange(g1, g2, ncol=2)
![enter image description here]()
Ответ 2
Вы можете установить собственную шкалу заполнения, используя scale_fill_manual
. Я создаю именованный вектор с цветами и разными значениями "c".
dd <- union(df1$c,df2$c)
dd.col <- rainbow(length(dd))
names(dd.col) <- dd
Тогда:
g1 <- ggplot(df1, aes(x=x, y=y, fill=c)) +
geom_bar(stat="identity") +
scale_fill_manual("Legend", values = dd.col)
g2 <- ggplot(df2, aes(x=x, y=y, fill=c)) +
geom_bar(stat="identity") +
scale_fill_manual("Legend", values = dd.col)
grid.arrange(g1, g2, ncol=2)
![enter image description here]()
Ответ 3
Чтобы сделать такие составные графики, ggplot2
имеет грани:
df1$id = 'A'
df2$id = 'B'
df_all = rbind(df1, df2)
ggplot(df_all, aes(x=x, y=y, fill=c)) +
geom_bar(stat="identity") +
facet_wrap(~id)
![enter image description here]()
При использовании граней ggplot2
обрабатывает оба графика как одно целое, сохраняя одно и то же значение цветового значения.