当我使用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
ggplot2
按照它们的顺序打印因子,因此您可能还会看到下面的两个解决方案。一个使用来自factor
的base
,另一个使用来自fct_reorder
的forcats
,我也喜欢并经常使用它,因为它必须使用自定义顺序函数时具有灵活性:
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()
你可以按照你想要的顺序传递limits
的scale_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))))