R语言 双向条形图中的类别顺序

ngynwnxp  于 2023-04-03  发布在  其他
关注(0)|答案(1)|浏览(158)

我试图生成一个简单的条形图,将类别Map到正值和负值。我知道类别顺序是通过ggplot2中的factor设置的,但是,类别只对小于零的值按顺序排列,而对大于零的值则不按顺序排列。我无法在图和图例中以正确的顺序获得类别。
考虑以下数据和绘图:

library(ggplot2)
library(dplyr)
library(tibble)

dat <- tribble(
  ~val, ~cat, ~label, ~order,
  -10, "Negative 2", "A", 1,
  -20, "Negative 1", "A", 2,
  5, "Positive 1", "A", 3,
  10, "Positive 2", "A", 4,
  20, "Positive 3", "A", 5
) |>
  mutate(cat = factor(cat, levels = unique(cat)))

dat |> 
  ggplot(aes(x = val, 
             y = label, 
             fill = cat)) +
  geom_col(color = "transparent") +
  geom_label(aes(label = order), 
             show.legend = FALSE, 
             color = "white", 
             size = 5, 
             position = position_stack(vjust = .5)) +
  theme(legend.position = "bottom")

这里图例的顺序是正确的,但是图中的正类别是颠倒的。顺序应该是1, 2, 3, 4, 5而不是1, 2, 5, 4, 3。我如何修复它,使类别和图例都处于正确的顺序?

gcuhipw9

gcuhipw91#

实际上,ggplot2会考虑因子的阶数。
自动以与组美学相反的顺序堆叠值,对于条形图,组美学通常由填充美学定义。(请参见?position_stack
因此,在你的例子中,顺序是5 - 4 - 3 - 2 - 1。这就是堆栈所显示的。
对于发散条形图和正负值,获得堆栈的顺序和图例的正确性更棘手,我建议显式设置group aes,即在您的情况下,您可以通过根据val ue记录来设置堆栈的顺序,这是您的顺序反映的,但坚持您的fill顺序:

library(ggplot2)
library(dplyr)
library(tibble)

dat <- tribble(
  ~val, ~cat, ~label, ~order,
  -10, "Negative 2", "A", 1,
  -20, "Negative 1", "A", 2,
  5, "Positive 1", "A", 3,
  10, "Positive 2", "A", 4,
  20, "Positive 3", "A", 5
) |>
  mutate(
    order1 = reorder(cat, -val),
    cat = factor(cat, unique(cat))
  )

dat |>
  ggplot(aes(
    x = val,
    y = label,
    fill = cat,
    group = order1
  )) +
  geom_col(color = "transparent") +
  geom_label(aes(label = order),
    show.legend = FALSE,
    color = "white",
    size = 5,
    position = position_stack(vjust = .5)
  ) +
  theme(legend.position = "bottom")

相关问题