绘制geom_bar()时避免ggplot对x轴排序

b91juud3  于 2023-01-28  发布在  其他
关注(0)|答案(6)|浏览(292)

我想用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()

目前的数字如下所示:

xn1cxnb4

xn1cxnb41#

你需要告诉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")

3z6pesqy

3z6pesqy2#

下面是一种不修改原始数据但使用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)

zpjtge22

zpjtge223#

dplyr让你很容易创建一个row列,你可以在ggplot中重新排序。

library(dplyr)
dat <- read.table("...") %>% mutate(row = row_number())
ggplot(df,aes(x=reorder(V1,row),y=V2))+geom_bar()
ddarikpa

ddarikpa4#

如果希望避免更改原始数据,则可以使用forcatstidyverse的一部分)中的fct_inorder来保持数据沿x轴的原始顺序(而不是更改为字母顺序)。

library(tidyverse)

ggplot(dat, aes(x = fct_inorder(V1), y = V2)) +
  geom_bar(stat = "identity")
    • 产出**

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))
xoefb8l8

xoefb8l85#

您也可以按照here所述重新排序相应的因子

x$name <- factor(x$name, levels = x$name[order(x$val)])
ljsrvy3e

ljsrvy3e6#

正如其他答案所指出的,如果您不希望ggplot假定显示内容的顺序,它希望您指定一个变量作为因子。如果您正在处理已经排序的数据,使用readr库是最简单的方法。
使用read_table而不是read.table函数,并作为col_types参数的一部分,指定带有标签的列(本例中为V1)作为因子。对于此类小型数据集,简单的格式字符串通常是最简单的方法

dat <- read_table("http://dpaste.com/1469904/plain/", col_types = "fd")

字符串"fd"告诉read_table第一列是因子,第二列是双精度型。函数的帮助文件包括其他类型数据的字符Map。

相关问题