R 是否正确使用scale_fill_manual()在ggplot2中创建多色直方图条?

R 是否正确使用scale_fill_manual()在ggplot2中创建多色直方图条?,r,ggplot2,R,Ggplot2,我有一系列的数据文件,我想在R中探索,每个文件我都计划用一个列变量生成一个数据框,为了这个问题的目的,我将把这个列变量标记为foo。foo的范围位于区间[0,7000]上。作为数据探索练习的一部分,我想创建foo的一维直方图,但有一点扭曲:foo在(10007000)之间的值对我来说特别“有趣”,因此我想使用调色板对该数据范围内的各个直方图条进行颜色编码(也就是说,因为后来我打算重新使用相同的调色板来映射数据框中临时省略的其他一些列的数据,以避免我的问题变得不必要的过于复杂)。相反,foo的值在

我有一系列的数据文件,我想在R中探索,每个文件我都计划用一个列变量生成一个数据框,为了这个问题的目的,我将把这个列变量标记为
foo
foo
的范围位于区间[0,7000]上。作为数据探索练习的一部分,我想创建
foo
的一维直方图,但有一点扭曲:foo在(10007000)之间的值对我来说特别“有趣”,因此我想使用调色板对该数据范围内的各个直方图条进行颜色编码(也就是说,因为后来我打算重新使用相同的调色板来映射数据框中临时省略的其他一些列的数据,以避免我的问题变得不必要的过于复杂)。相反,
foo
的值在[01000]范围内对我来说没有那么有趣,但是我仍然希望能够在直方图中看到它们,尽管是灰色的,在有任何值存在的情况下

在下面的代码示例中,我生成了一个人工样本数据框,并尝试使用
ggplot2
绘制直方图,使用
scale\u fill\u manual()选择填充颜色
。我确实得到了一个多色直方图,但它看起来并不像预期的那样:
ggplot2
似乎忽略了我关于在颜色之间放置分隔符的说明。具体来说,问题似乎与缺少数据有关:碰巧没有数据的间隔似乎不会映射到颜色上,尽管它这也意味着灰色最终会被映射到间隔(10001500),而不是我所期望的[01000]

我的问题:如何强制
ggplot2
将特定的颜色填充代码指定给特定的数据范围,即使某些间隔为空白且没有数据,并且因此不会生成与这些间隔对应的直方图条

我已经在下面包含了我的代码的初始版本,以及一个虚拟示例数据帧和它生成的输出的手工注释版本

library(ggplot2)

# Minimum and maximum values of interest (for other data sets, additional
# values that are of lesser interest may fall within the interval [0, 1000])
lolim<-1000
hilim<-7000
bwdth<-500
# Construct sample data frame
df<-data.frame(foo=c(1200, 1300, 1750, 2200, 2300, 2750, 3200, 3300, 3750,
                     4200, 4300, 4750, 6200, 6300, 6750))
# Construct a discrete factor variable which can later be mapped onto
# discrete color codes
df$colcode<-cut(df$foo, breaks=c(0, seq(lolim, hilim, bwdth)),
                include.lowest=TRUE)

# Create the breaks and color codes to be used by scale_fill_manual()
brk<-levels(df$colcode)
ncol<-length(brk)
# My expectation is that "#808080FF" (gray) will map onto the range
# [0, 1000], while a palette consisting of 12 sequential shades of the
# rainbow will be mapped onto the range (1000, 7000], in intervals of 500
colors<-c("#808080FF", rainbow(ncol-1))

# Draw the histogram
print(ggplot(df, aes(foo)) +
        geom_histogram(aes(fill=colcode), binwidth=bwdth) +
        scale_fill_manual("", breaks=brk, values=colors))
库(ggplot2)
#感兴趣的最小值和最大值(对于其他数据集,附加
#较不感兴趣的值可能在区间[0,1000]内)

lolim您可以将
drop
参数设置为
FALSE
。请参阅
?离散型\u刻度
从刻度中删除未使用的因子级别(TRUE或FALSE)


谢谢!这对我来说有点违反直觉,在一个声称提供“手动”控制的功能中,我需要采取类似这样的额外步骤才能禁用“自动”纠正行为——我认为在这种特殊情况下,自动纠正算法通常会在默认情况下被禁用。再次感谢您发现我的错误!
ggplot(df, aes(foo)) +
  geom_histogram(aes(fill = colcode), binwidth = bwdth) +
  scale_fill_manual("", breaks = brk, values = colors, drop = FALSE)