Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 按两个变量之一对柱状图排序_R_Ggplot2 - Fatal编程技术网

R 按两个变量之一对柱状图排序

R 按两个变量之一对柱状图排序,r,ggplot2,R,Ggplot2,我正在使用ggplot绘制一个条形图,它有两个值与每个名称关联,一个值为正值,另一个值为负值。我想按正数降序排列图表中的条形图,而不是按名称的字母顺序排列 如果名称排序有一个通用的手动覆盖,我也会对此感兴趣 我已经在网上探索了其他ggplot线程,它们在只有一个变量的情况下按降序排列条形图,我知道如何做到这一点。然而,当我尝试这样做的时候,当有两个变量时,我就有了这个问题 下面是我写的数据和绘图函数的类似示例: example_data <- data.frame(NAME = rep(c

我正在使用ggplot绘制一个条形图,它有两个值与每个名称关联,一个值为正值,另一个值为负值。我想按正数降序排列图表中的条形图,而不是按名称的字母顺序排列

如果名称排序有一个通用的手动覆盖,我也会对此感兴趣

我已经在网上探索了其他ggplot线程,它们在只有一个变量的情况下按降序排列条形图,我知道如何做到这一点。然而,当我尝试这样做的时候,当有两个变量时,我就有了这个问题

下面是我写的数据和绘图函数的类似示例:

example_data <- data.frame(NAME = rep(c('C', 'D', 'A', 'E', 'B'),2), 
                           Variable = c(rep('S', 5), rep('L', 5)), 
                           Values = c(-39,-21,-19,-11,-9,30,16,13,7,6))

ggplot(data = example_data, 
       aes(x = NAME, y = Values, fill = Variable)) + 
  geom_bar(stat = "identity", alpha=1) + 
  geom_text(aes(label=round(Values,1))) + 
  ylab("Unit of measurement") + 
  scale_fill_manual(values=c('#AED6F1','#F5B7B1'))

我希望结果是将条排序为[C,D,A,E,B],但第一个输出中的名称顺序是[A,B,C,D,E],第二个输出中的名称顺序是[C,A,D,E,B]。

您可以根据值列按降序排列数据帧的行,然后使用
forcats
包中的
fct\u按第一次出现的顺序对名称重新排序

library(dplyr)


example_data %>%
  arrange(desc(Values)) %>%
  mutate(NAME = forcats::fct_inorder(NAME)) %>%
  ggplot(aes(NAME, Values, fill = Variable)) +
  geom_col() + # identical to geom_bar(stat = "identity"), with less typing
  geom_text(aes(label = Values)) + 
  ylab("Unit of measurement") + 
  scale_fill_manual(values=c('#AED6F1', '#F5B7B1'))

这是一个相对简单的案例,但即使您有复杂的排序逻辑,其中涉及到多个变量的排序,同样的方法也会起作用

library(dplyr)


example_data %>%
  arrange(desc(Values)) %>%
  mutate(NAME = forcats::fct_inorder(NAME)) %>%
  ggplot(aes(NAME, Values, fill = Variable)) +
  geom_col() + # identical to geom_bar(stat = "identity"), with less typing
  geom_text(aes(label = Values)) + 
  ylab("Unit of measurement") + 
  scale_fill_manual(values=c('#AED6F1', '#F5B7B1'))