我试图生成一个简单的条形图,将类别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
。我如何修复它,使类别和图例都处于正确的顺序?
1条答案
按热度按时间gcuhipw91#
实际上,
ggplot2
会考虑因子的阶数。自动以与组美学相反的顺序堆叠值,对于条形图,组美学通常由填充美学定义。(请参见
?position_stack
)因此,在你的例子中,顺序是5 - 4 - 3 - 2 - 1。这就是堆栈所显示的。
对于发散条形图和正负值,获得堆栈的顺序和图例的正确性更棘手,我建议显式设置
group
aes,即在您的情况下,您可以通过根据val
ue记录来设置堆栈的顺序,这是您的顺序反映的,但坚持您的fill
顺序: