【发布时间】:2017-01-06 21:30:12
【问题描述】:
我有一个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 变量增加了对颜色子集的控制级别。
【问题讨论】:
-
这在很大程度上是一个非常好的和可重复的问题(干得好!),但我需要澄清一下。 (a) 我很惊讶你的示例情节不包含你想要的方面......只是添加
+ facet_wrap(~age_group)你的想法?也许将其包含在您的示例中。 (b) 你对传奇有什么想法?一个具有所有年龄组/班级互动的传奇人物?还是每个子图都有一个单独的图例? -
我在上面的问题中添加了我想要的最后一个方面。你的假设是正确的,我只想包括
facet(~age_group)。你关于传说的观点很有趣,我没有想到这一点。某种传说,我可以在对应于“高”,“中”和“低”级别的块中使用三种颜色会很好,但我想这超出了ggplot的控制范围。欢迎提出建议。 -
我有 this old question 关于在
grid系统中制作“网格”图例 - 你可能会适应它。至于颜色,我只需在您的数据中添加一列,它是 class 和 age_group 的组合,然后填充(使用paste或interaction创建新列)。我现在没有时间写一个好的答案,但是如果没有其他人先写,我会稍后再找时间。 -
您的示例是否可能不太理想?对于每个 age_group,只有一个 class 值(例如,age_group 1 只有 class“high”)。这意味着您将在每个方面获得不同的颜色,而无需做任何特别的事情。如果这不是您的想法,那么创建一个更真实的可重现示例将很有用。 (为了弥补所有的唠叨:正如 Gregor 已经提到的,您确实创建了一个可重复的工作示例,这是一件非常好的事情!)
-
我相信 Mark Peterson 在他的回答中生成的数据更能代表我正在使用的数据,如前所述,您可以在各个年龄段获得许多课程。感谢您的友好评论。