首页 > 解决方案 > 在 geom_col 躲避位置中未保留的组内排序

问题描述

我有一个数据框,它是我尝试在下面复制的更大数据集的摘要。我将分数列设置为一个因素,以便图中的命名正确。

我想在分数组和计数列 (n) 的组内对这个数据框进行排序。因此,我想使用 ggplot 显示我的水平条的顺序:在 X 轴上(或输出中的 Y,因为它的翻转/水平条)上的从min到(图表的底部到顶部),以及在分数组内,开始max从分数组中,count ( )min的降序排列。n应该为下一组(即)保留相同的顺序,但是可以根据它们的计数( )值low插入未出现在前一个乐谱中的主题。n

我尝试对我的数据框进行排序,但我的结果不是我所期望的。例如,第 5 行和第 6 行应该在我的排序数据框中切换,因为cos之前出现foo在上一个分数(即min)中。我尝试使用 reorder 和 forcats 更改因子级别顺序,但没有任何程度......

require(tidyverse)

df = tribble(
~score, ~ theme, ~ n,
5, "foo", 1,
5, "bar", 1,
4, "let", 3,
3, "let", 1,
3, "cos", 1,
3, "foo", 2,
2, "foo", 3,
2, "let", 4,
2, "cos", 5
)

data = df %>%
      group_by(score, theme) %>%
      arrange(desc(score), n) %>%
      mutate_at("score", function(x) factor(x, levels = c(1, 2, 3, 4, 5), labels = c("min", "low", "avg", "high", "max")))
data

plot = data %>%
      ggplot(mapping = aes(x = score, y = n, fill = theme)) +
      geom_col(position = position_dodge2(width = 0.9, preserve = "single")) +
      coord_flip() +
      scale_y_continuous(expand = expansion(mult = c(0, .1))) +
      guides(fill = guide_legend(ncol = 2, byrow = TRUE)) +
      labs(y = "n", x = "scoring", fill = "vars")

plot

我的预期图表将是:

MAX BAR (<- unsure since equal)
MAX FOO
HIGH LET
AVG FOO
AVG LET
AVG COS
LOW FOO
LOW LET
LOW COS

标签: rsortingggplot2dplyrtidyverse

解决方案


factordscore但不是theme. 但是要知道这一点:ggplot2将从 y 轴原点对它们进行排序,因此您的“BAR before FOO”的顺序更好地表述为“BAR above FOO”或“BAR after FOO”,这意味着因子“FOO before BAR” .

df$theme <- factor(df$theme, levels = rev(c("bar", "foo", "let", "cos")))
# run the 'data' and 'plot' code, unchanged

(这里不是绝对必须使用rev,它的使用纯粹是示范性的,声明我们认为更重要的东西的顺序——"bar"在上面——与使用的方向相反ggplot。)

在此处输入图像描述

如果您想要与我更改之前相同的颜色,请添加

... +
  scale_fill_manual(values = c(bar="#F8766D", foo="#00BFC4", cos="#7CAE00", let="#C77CFF"))

(我通过使用gg_color_hue(4)然后重新排序values=矢量来获得颜色以使其正确。)


推荐阅读