【发布时间】:2015-07-14 22:33:58
【问题描述】:
假设我有一个很长的数据集,我想在 x 轴上为特定标签着色。在下面的示例中,我想为 Valiant 的标签着色。
# Packs
require(ggplot2)
require(reshape2)
# Data and trans
data(mtcars)
mtcars$model <- rownames(mtcars)
mtcars <- melt(mtcars, id.vars = "model")
# Some chart
ggplot(data = subset(x = mtcars, subset = mtcars$variable == "cyl"),
aes(x = model, y = value)) +
geom_bar(stat = "identity") +
theme(axis.text.x = element_text(angle = 90,
colour =
ifelse(mtcars$model == "Valiant",
"red","black")))
代码生成的下面的图表是错误的,因为错误的标签被着色了。
原因很简单,ifelse 创建的内容与轴上的顺序不匹配。我可以通过强制ggplot 为特定行着色来修复代码。下面的代码为右侧标签着色,如用于图表的特定 data.frame 中,Valiant 值为 31 的行。
# Fixed chart
ggplot(data = subset(x = mtcars, subset = mtcars$variable == "cyl"),
aes(x = model, y = value)) +
geom_bar(stat = "identity") +
theme(axis.text.x = element_text(angle = 90,
colour =
ifelse(as.numeric(rownames(mtcars)) == 31,
"red","black")))
显然,这种解决方案是极其不切实际的。在实际数据上,我有大量包含多列(地理、性别、指标、价值等)的观察结果。随后通过子集过滤该数据,并将不同的选项传递给aes 设置。试图找出应该着色的行是一场噩梦。我正在寻找一种解决方案,使我能够:
- 相对轻松地指示要对特定观察进行着色,而无需尝试使用行号
- 理想情况下,我想使用带有一些字符串的
id来指示我想要突出显示的文本 - 我想将解决方案封装在
ggplot2代码中,我不想创建单独的数据子集只是为了导出着色向量,因为我将多次这样做。这将不必要地增加对象。 - 在实践中,我想要这样的解决方案:无论图表上的内容如何,当您在 x 轴上找到此字符串时,将其变为红色
【问题讨论】:
标签: r charts ggplot2 label subset