我有以下数据,我想用 ggplot 绘制:
SC_LTSL_BM 16.8275
SC_STSL_BM 17.3914
proB_FrBC_FL 122.1580
preB_FrD_FL 18.5051
B_Fo_Sp 14.4693
B_GC_Sp 15.4986
我想做的是制作条形图并保持条形的顺序(即从SC_LTSL_BM ...B_GC_Sp
开始)。但是 ggplot geom_bar 的默认行为是对它们进行排序。我怎样才能避免这种情况?
library(ggplot2)
dat <- read.table("http://dpaste.com/1469904/plain/")
pdf("~/Desktop/test.pdf")
ggplot(dat,aes(x=V1,y=V2))+geom_bar()
dev.off()
https://i.stack.imgur.com/BhGrf.png
你需要告诉 ggplot 你已经有了一个有序的因子,所以它不会自动为你排序。
dat <- read.table(text=
"SC_LTSL_BM 16.8275
SC_STSL_BM 17.3914
proB_FrBC_FL 122.1580
preB_FrD_FL 18.5051
B_Fo_Sp 14.4693
B_GC_Sp 15.4986", header = FALSE, stringsAsFactors = FALSE)
# make V1 an ordered factor
dat$V1 <- factor(dat$V1, levels = dat$V1)
# plot
library(ggplot2)
ggplot(dat,aes(x=V1,y=V2))+geom_bar(stat="identity")
https://i.stack.imgur.com/co7zB.png
这是一种不修改原始数据,而是使用 scale_x_discrete
的方法。来自 ?scale_x_discrete
,“使用限制来调整显示的级别(以及显示顺序)”。例如:
dat <- read.table(text=
"SC_LTSL_BM 16.8275
SC_STSL_BM 17.3914
proB_FrBC_FL 122.1580
preB_FrD_FL 18.5051
B_Fo_Sp 14.4693
B_GC_Sp 15.4986", header = FALSE, stringsAsFactors = FALSE)
# plot
library(ggplot2)
ggplot(dat,aes(x=V1,y=V2))+
geom_bar(stat="identity")+
scale_x_discrete(limits=dat$V1)
https://i.stack.imgur.com/eE2Vd.png
dplyr 让您可以轻松地创建一个 row
列,您可以在 ggplot 中重新排序。
library(dplyr)
dat <- read.table("...") %>% mutate(row = row_number())
ggplot(df,aes(x=reorder(V1,row),y=V2))+geom_bar()
如果您想避免更改原始数据,则可以使用 forcats
中的 fct_inorder
(tidyverse
的一部分)来保持数据沿 x 轴的原始顺序(而不是将其更改为字母顺序) .
library(tidyverse)
ggplot(dat, aes(x = fct_inorder(V1), y = V2)) +
geom_bar(stat = "identity")
输出
https://i.stack.imgur.com/wmKg9.png
forcats
的另一个选项是使用 fct_relevel
手动指定顺序。
ggplot(dat, aes(
x = fct_relevel(
V1,
"SC_LTSL_BM",
"SC_STSL_BM",
"proB_FrBC_FL",
"preB_FrD_FL",
"B_Fo_Sp",
"B_GC_Sp"
),
y = V2
)) +
geom_bar(stat = "identity") +
xlab("Category")
数据
dat <- structure(list(
V1 = c(
"SC_LTSL_BM",
"SC_STSL_BM",
"proB_FrBC_FL",
"preB_FrD_FL",
"B_Fo_Sp",
"B_GC_Sp"
),
V2 = c(16.8275, 17.3914,
122.158, 18.5051, 14.4693, 15.4986)
),
class = "data.frame",
row.names = c(NA, -6L))