ggplot2:如何在直方图中根据二进制范围对特定的二进制进行着色。

问题描述 投票:0回答:1

我正在用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))

我得到了这个图

plot

我把最左边的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: 这是我想要的图。

plot_goal

r ggplot2 histogram
1个回答
2
投票

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))

single highlight

选项。

  • 去掉 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.

multiple bin colors


编辑:

这是你的图像,尽管有颜色。

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))

updated ggplot2


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))

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.