为什么ggplot会使用默认颜色而不是指定的颜色?

3

我正在尝试让ggplot2展示直方图中的一条线与其他线的颜色不同。我已经成功地完成了这个目标,但是当指定另一个颜色集时,ggplot仍在使用默认颜色。 我确定代码中存在错误,但我无法确定错误出现在哪里。以下是数据和代码:

创建数据

library(ggplot2)
set.seed(71185)
dist.x <- as.data.frame(round(runif(100000, min= 1.275, max= 1.725), digits=2))
colnames(dist.x) <- 'sim_con'

开始直方图

ggplot(dist.x, aes(x = sim_con)) +
geom_histogram(colour = "black", aes(fill = ifelse(dist.x$sim_con==1.55, "darkgreen", "firebrick")), binwidth = .01) +
theme(legend.position="none")

这会导致以下图像: enter image description here 我不想使用默认颜色,而是想使用'darkgreen'和'firebrick'。代码中哪里出错了?感谢您提供的任何帮助。
2个回答

6

你离成功很近了!

在你的代码中,ggplot将你的填充解释为数据集中的变量- factor darkgreen 和 factor firebrick - 并且无法知道这些标签是颜色而不是动物物种的名称。

如果你在绘图末尾添加scale_fill_identity(),如下所示,它将把这些字符串解释为颜色(即identity),而不是数据的特征。

这种方法与@marat上面的优秀答案相比的一个好处是:如果你有一个复杂的图(例如使用geom_segment(),每个观察值都有一个起始值和一个结束值)并且你想在数据上应用两个填充比例尺(一个比例尺用于起始值,另一个比例尺用于结束值),你可以在数据处理步骤中进行条件逻辑,然后使用scale_fill_identity()相应地对每个观察值进行着色。

ggplot(
  data=dist.x,
  aes(
    x = sim_con,
    fill = ifelse(dist.x$sim_con==1.55, "darkgreen", "firebrick")
  )
) +
geom_histogram(
  colour = "black",
  binwidth = .01
) +
theme(legend.position="none") +
scale_fill_identity()

一个非常详细的解释。我认为你和马拉特的答案都很好地解决了当前的问题。你的解释很棒,可以帮助我们理解语法背后的奥秘,并为以后的应用打下基础。 - MattT
了解R中的非标准评估确实帮助我理解hadleyverse中某些包内部发生的情况:http://adv-r.had.co.nz/Computing-on-the-language.html,很高兴这对您有所帮助! - Andrew

5

我认为你无法在 aes 中明确设置颜色;你需要在 scale_fill_manual 中进行设置,如下面的示例:

ggplot(dist.x, aes(x = sim_con)) +
  geom_histogram(colour = "black", binwidth = .01,aes(fill=(sim_con==1.55))) + 
  scale_fill_manual(values=c('TRUE'='darkgreen','FALSE'='firebrick')) +
  theme(legend.position="none")

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接