如何使用ggplot2制作条形图并按非字母顺序排序。

3

我想通过 ggplot2 绘制一个箱线图,但它会按字母顺序排序箱子,我想改变它们的顺序。我该怎么做?

感谢任何帮助。

这是我的代码:

mydata <- data.frame(DRG=c(12,23,15,60,2),
                     XPA=c(30,25,55,70,63),
                     SHO=c(22,15,34,23,14),
                     ALA=c(120,95,113,126,103))
row.names(mydata) <- c("sample1","sample2","sample3","sample4","sample5")
mydata <- t(mydata)
mydata <- as.data.frame(mydata)

b.plot <- ggplot(data=mydata, aes(x=row.names(mydata), y=sample1)) +
  geom_bar(stat="identity" , color="green" , fill="yellowgreen", position="dodge" , width = 0.5) +
  xlab("Genes") +
  ylab("Expression") +
  theme(axis.text.x = element_text(size = 10, angle = 45, hjust = 1), 
        plot.margin = margin(0.5,0.5,0.5,2, "cm"))
b.plot

只是提醒一下:在那些被标记为重复的网站中,fct_relevel并没有作为答案提供。 - TarJae
2个回答

3

我们可以使用来自 tidyverse 中的 tibble 包中的 rownames_to_column 函数将行名转换为列名。

  1. 使用 fct_relevel 函数从 forcats 包中设置所需的顺序。

  2. 然后使用 ggplot2 (我使用了 geom_col())

library(tidyverse)

mydata %>% 
  rownames_to_column("gene") %>% 
  pivot_longer(
    cols = -gene
  ) %>% 
  mutate(gene = fct_relevel(gene, 
                            "SHO", "DRG", "ALA", "XPA")) %>% 
  ggplot(aes(x=gene, y=value))+
  geom_col(color="green" , fill="yellowgreen", position="dodge" , width = 0.5)+
  xlab("Genes")+
  ylab("Expression") +
  theme(axis.text.x = element_text(size = 10, angle = 45, hjust = 1), 
        plot.margin = margin(0.5,0.5,0.5,2, "cm"))

enter image description here


2

您可以将x设置为因子,然后使用levels指定所需的顺序。

library(tidyverse)

ggplot(data = mydata, aes(x = factor(
  row.names(mydata),
  levels = c("DRG", "XPA", "SHO", "ALA")
), y = sample1)) +
  geom_bar(
    stat = "identity" ,
    color = "green" ,
    fill = "yellowgreen",
    position = "dodge" ,
    width = 0.5
  ) +
  xlab("Genes") +
  ylab("Expression") +
  theme(
    axis.text.x = element_text(
      size = 10,
      angle = 45,
      hjust = 1
    ),
    plot.margin = margin(0.5, 0.5, 0.5, 2, "cm")
  )

输出

在此输入图片描述


亲爱的安德鲁,感谢您的回复。 我已经将x转换为因子,并且只更改了标签,但我想重新排列及其标签,而不仅仅是标签。 - zahra abdi
1
安德鲁,你需要设置级别。 - tjebo
@zahraabdi 我的意思是 levels 而不是 labels。我已经更新了答案以反映这一点。抱歉,当时有点晚了! - AndrewGB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接