geom_histogram 将具有相同填充类别的值聚集在一起

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

我正在尝试创建一个直方图,它使用数据集中的一列作为填充颜色,使用数据集中的另一列作为组。 这两个都在

aes()
中定义。 然后我在每个组周围添加一个白色边框。 组数多于填充类别。

我的问题是,当我定义组时,同一填充类别内的子组不会在条中堆叠在一起 - 它们似乎遵循随机顺序。 我尝试通过填充列对

data.frame
进行排序,然后将其传递给
ggplot()
但这没有帮助。

如何将具有相同填充类别的观察值一起显示,即使它们位于不同的子组中且来自不同的日期(我的 x 轴是日期)?

这是一些示例数据:

# Set seed for reproducibility:
set.seed(123)

# Set start date:
start_date <- as.Date("2024-01-01")

# Set end date:
end_date <- as.Date("2024-04-01")

# Create data.frame:
data <- data.frame(
  onset_date = sample(seq(start_date, end_date, by = "day"), 
                      100, 
                      replace = TRUE),
  category = sample(c("A", "B"), 
                    100, 
                    replace = TRUE))

# Add row names for grouping:
data$grouping <- as.numeric(row.names(data))

# Create epicurve_breaks
epicurve_breaks <- seq.Date(
  from = start_date, 
  to = end_date, 
  by = "week")

这是没有分组的直方图:

p1 <- ggplot(data, 
             aes(x = onset_date, fill = category)) +
  geom_histogram(breaks = epicurve_breaks, 
                 closed = 'left', 
                 colour = "white")

这给出了以下图 - - 正如您可以看到来自同一填充类别的实体堆叠在一起:

Plot without subgroups

这是我添加组时的绘图代码:

p2 <- ggplot(data, 
             aes(x = onset_date, fill = category, group = grouping)) +
  geom_histogram(breaks = epicurve_breaks, 
                 closed = 'left', 
                 colour = "white")

这是分组图 - 现在类别 A 和 B 方块不再聚集在条形图上:

Plot with subgroups

任何有关如何将类别分组在一起(即使类别内有子组)的建议,我们将不胜感激。

r ggplot2 fill group geom-histogram
1个回答
2
投票

按因子级别排序。使用

forcats
我们可以做:

ggplot(
  data, 
  aes(onset_date, fill = category, group = fct_reorder(factor(grouping), category))
) +
  geom_histogram(
    breaks = epicurve_breaks, 
    closed = 'left', 
    colour = "white"
  ) + 
  coord_fixed(6)

(我不确定为什么我的数据看起来不同,我使用了你的种子。)

enter image description here

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