我有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
- (通过变量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
变量增加对颜色子集的控制级别。
答案 0 :(得分:5)
我不完全确定为什么你想要这样做,所以有点难以知道我提出的是否解决了你的实际用例。
首先,我生成了一个不同的数据集,实际上每个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种(或更多,用于不同用例)颜色。