我正在用ggplot2绘制一个直方图,并试图弄清楚如何将特定的仓用比其他仓更多的颜色来着色。我想着色的区域是由它们的区域边缘范围定义的。
我发现类似的问题都是要求根据原始值而不是bin范围进行有条件的着色。要么为特定值 或 临界点.
例如:
dt <- data.table(x = runif(10000))
ggplot(dt, aes(x)) +
geom_histogram(binwidth = 0.01, boundary = 0, closed = "left",
col = "darkgreen", fill = "darkgreen", alpha = 0.5, size = 0.1) +
scale_x_continuous(breaks = seq(0, 1, 0.1))
我得到了这个图
我把最左边的bin定义为[0, 0. 01), 从那里计算出其他bin.
现在我想给下面的bin涂上不同的颜色。[0, 0. 01), [0. 1, 0. 11), [0. 2, 0. 21)... ...,也就是说,从[0, 0. 01]开始的仓位要用不同的颜色。
> seq(0, 1, 0.1)
[1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
如何才能做到这一点?
EDIT: 这是我想要的图。
davidnortes的答案很好地显示了颜色,如果你只想突出显示,这里有一个选项。一些 仓。我先说说 cut
来预先识别一些仓位(这需要与您的 binwidth=
和其他选项,以 geom_histogram
),然后再通过简单的逻辑来确定要突出哪些。
library(dplyr)
dt %>%
mutate(
grp = cut(x, seq(0, 1, by = 0.01), labels = FALSE, include.lowest = TRUE),
is6 = between(grp, 60, 69)
) %>%
ggplot(aes(x, fill = is6)) +
geom_histogram(binwidth = 0.01, boundary = 0, closed = "left",
col = "darkgreen", alpha = 0.5, size = 0.1) +
scale_x_continuous(breaks = seq(0, 1, 0.1))
选项。
is6
添 + scale_fill_discrete(guide = "none")
如果你想要多个不同的频段,也许 case_when
可以帮助,指出 is6
不需要符合逻辑。
dt %>%
mutate(
grp = cut(x, seq(0, 1, by = 0.01), labels = FALSE, include.lowest = TRUE),
highlight = case_when(
between(grp, 60, 69) ~ "A",
between(grp, 20, 25) ~ "B",
TRUE ~ "C")
) %>%
ggplot(aes(x, fill = highlight)) +
geom_histogram(binwidth = 0.01, boundary = 0, closed = "left",
col = "darkgreen", alpha = 0.5, size = 0.1) +
scale_x_continuous(breaks = seq(0, 1, 0.1))
...scale_fill_discrete
也适用于此。
你可能需要为每组的 highlight
诸如此类,使用 scale_fill_manual
.
编辑:
这是你的图像,尽管有颜色。
dt %>%
mutate(
grp = (x %% 0.1 < 0.01)
) %>%
ggplot(aes(x, fill = grp)) +
geom_histogram(binwidth = 0.01, boundary = 0, closed = "left",
col = "darkgreen", alpha = 0.5, size = 0.1) +
scale_x_continuous(breaks = seq(0, 1, 0.1))
如果你想沿着你的变量X创建数值范围,并以不同的方式给它们着色,你可以使用... ... cut
函数。
cut将x的范围划分为若干区间,并根据x中的数值属于哪个区间对其进行编码。最左边的区间对应一级,下一个最左边的对应二级,以此类推。
所以,稍微调整一下你的代码,你就会有。
#Grouping variable 'x' in dt according sequence 'seq(0, 1, 0.1)'
dt$breaks <- cut(dt$x, breaks = seq(0, 1, 0.1))
#Plotting
ggplot(dt, aes(x, col = breaks, fill = breaks)) +
geom_histogram(binwidth = 0.01, boundary = 0, closed = "left", alpha = 0.5, size = 0.1) +
scale_x_continuous(breaks = seq(0, 1, 0.1))