替代方式来安排barplot(geom_bar)?

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

当我使用ggplot绘制一个盒子图时,我得到一个这样的图:

使用R代码:

ggplot(nin) + geom_bar(aes(Planner.Group.No))

但我希望条形图从较大的值变为较小的值,因此我编写了这些附加代码

b <- data.frame(table(x = nin$Planner.Group.No))
b <- arrange(b, Freq)

ggplot(b, aes(x = reorder(x, -Freq), y = Freq)) + geom_bar(stat = "identity")

我想知道在ggplot中是否有另一种方法可以避免额外的代码行。

以下是nin数据集的示例:

   Planner.Group.No Order.Status
1               P0B     Finished
2               P0C     Finished
3               P0C     Finished
4               P0A     Finished
5               P0C     Finished
6               P0B     Finished
7               P0C     Finished
r ggplot2
2个回答
2
投票

ggplot2按照它们的顺序打印因子,因此您可能还会看到下面的两个解决方案。一个使用来自factorbase,另一个使用来自fct_reorderforcats,我也喜欢并经常使用它,因为它必须使用自定义顺序函数时具有灵活性:

df <- read.table(text = "Planner.Group.No Order.Status
1               P0B     Finished
2               P0C     Finished
3               P0C     Finished
4               P0A     Finished
5               P0C     Finished
6               P0B     Finished
7               P0C     Finished", header = TRUE)
df


library(tidyverse) # for ggplot2 and forcats

# using factors
ggplot(df, aes(x = factor(Planner.Group.No, 
                          levels = names(sort(table(Planner.Group.No), decreasing = T))))) + 
  geom_bar()

# using factors with forcats:
ggplot(df, aes(x = fct_reorder(f = Planner.Group.No, 
                               x = Planner.Group.No, 
                               fun = length, 
                               .desc = TRUE))) + 
  geom_bar()

1
投票

你可以按照你想要的顺序传递limitsscale_x_discrete参数x值的向量,所以:

library(ggplot2)

nin <- data.frame(Planner.Group.No = c("P0B", "P0C", "P0C", "P0A", "P0C", "P0B", "P0C"), 
                  Order.Status = c("Finished", "Finished", "Finished", "Finished", "Finished", "Finished", "Finished"),
                  stringsAsFactors = FALSE)

ggplot(nin, aes(Planner.Group.No)) + 
    geom_bar() + 
    scale_x_discrete(limits = names(sort(-table(nin$Planner.Group.No))))

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