我有一个data.frame
,类似于以下内容:
set.seed(100)
df <- data.frame(year = rep(2011:2014, 3),
class = rep(c("high", "middle", "low"), each = 4),
age_group = rep(1:3, each = 4),
value = sample(1:2, 12, rep = TRUE))
我想通过
facet
-ing(通过变量age_group
)生成三个图,这些图看起来与以下代码生成的图相似:library(ggplot2)
blue <- c("#bdc9e1", "#74a9cf", "#0570b0")
ggplot(df) + geom_bar(aes(x = year, y = value,
fill = factor(class, levels = c("high", "middle", "low"))),
stat = "identity") +
scale_fill_manual(values = c(blue)) +
guides(fill = FALSE)
但是,每个方面都有不同的配色方案,其中所有颜色都是由我自己指定的。
我似乎想要这里发生的事情的更具体的版本:ggplot2: Change color for each facet in bar chart
因此,使用我提供的数据,我希望获得三个多面图,并按
age_group
进行划分,其中每个图上的填充量均按class
的级别给出,所有颜色(共9种)将由我自己手动指定。编辑:为澄清起见,以下代码的确提供了我想最终涉及的方面:
ggplot(df) + geom_bar(aes(x = year, y = value,
fill = factor(class, levels = c("high", "middle", "low"))),
stat = "identity") +
scale_fill_manual(values = c(blue)) +
guides(fill = FALSE) +
facet_wrap(~ age_group)
通过
class
变量增加了对颜色子集的控制级别。 最佳答案
我不确定您为什么要这么做,因此很难知道我是否提出了解决您的实际用例的方法。
首先,我生成了一个不同的数据集,该数据集实际上在每个age_group中具有每个类:
set.seed(100)
df <- data.frame(year = rep(2011:2014, 3),
class = rep(c("high", "middle", "low"), each = 12),
age_group = rep(1:3, each = 4),
value = sample(1:2, 36, rep = TRUE))
如果要在每个
age_group
中寻找类似的明暗梯度,则可以直接使用alpha
完成此操作,而不必担心添加额外的数据列:ggplot(df) +
geom_bar(aes(x = year, y = value,
fill = factor(age_group)
, alpha = class ),
stat = "identity") +
facet_wrap(~age_group) +
scale_alpha_discrete(range = c(0.4,1)) +
scale_fill_brewer(palette = "Set1"
, name = "age_group")
在这里,我将alpha的范围设置为可以给出合理可见的颜色,并且只是从RColorBrewer中选择了一个默认调色板来显示该想法。这给出了:
它还提供了一个相对可用的图例作为起点,尽管您可以进一步对其进行修改(这是我为另一个问题提供的类似图例答案:https://stackoverflow.com/a/39046977/2966222)
另外,如果您确实要自己指定颜色,则可以在数据中添加一列,然后根据该颜色作为基础:
df$forColor <-
factor(paste0(df$class, " (", df$age_group , ")")
, levels = paste0(rep(c("high", "middle", "low"), times = 3)
, " ("
, rep(1:3, each = 3)
, ")") )
然后,将其用作填充。请注意,这里我使用的是
RColorBrewer
brewer.pal
来选择颜色。我发现第一种颜色太浅,无法显示出像这样的条形,因此我将其排除在外。ggplot(df) +
geom_bar(aes(x = year, y = value,
fill = forColor),
stat = "identity") +
scale_fill_manual(values = c(brewer.pal(4, "Blues")[-1]
, brewer.pal(4, "Reds")[-1]
, brewer.pal(4, "Purples")[-1]
)
, name = "Class (age_group)") +
facet_wrap(~age_group)
给出:
图例比较忙,但是可以像我链接到的其他答案一样进行修改。然后,这将允许您设置所需的9种(或更多,针对不同的用例)颜色。
关于r - 在构面之间更改配色方案,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41492733/