在 R 中保持 geom_bar() ggplot2 的数据顺序

Posted

技术标签:

【中文标题】在 R 中保持 geom_bar() ggplot2 的数据顺序【英文标题】:keep data order for geom_bar() ggplot2 in R 【发布时间】:2021-08-21 07:17:41 【问题描述】:

我创建了以下数据框:

    condition <- rep(c("Pretreatment", "Normal"), 4)
    value <- c( "3.6", "0.2", "5.6", "0.2", "7.4", "0.2", "8.8", "0.2")
    time<- c("5","5", "10", "10", "15","15", "20", "20")
    domedata <- data.frame(time, condition, value)

我想按顺序保持 x 中的时间条,因为它告诉我们时间 5 分钟、10 分钟、15 分钟、20 分钟。 ggplot 在最后绘制我的 5 分钟。我正在这样做:

    ggplot(domedata, aes(fct_infreq(time), fill=condition, x=time, y=value)) +
           geom_bar(position="dodge", stat = "identity") 

【问题讨论】:

将时间转换为数字或尝试使用forcats::fct_inorder 【参考方案1】:

看来您正在传递给x 美学,所以最后一个将覆盖第一个。 下面我删除了美学的第一个参数是多余的,我使用了fct_inorder,@stefan 也评论了

condition <- rep(c("Pretreatment", "Normal"), 4)
value <- c( "3.6", "0.2", "5.6", "0.2", "7.4", "0.2", "8.8", "0.2")
time <- c("5","5", "10", "10", "15","15", "20", "20")
domedata <- data.frame(time, condition, value)

ggplot(domedata, aes(fill=condition, x=fct_inorder(time), y=value)) +
  geom_bar(position="dodge", stat = "identity") 

但请注意,由于您的值是字符串,因此 y 轴的比例有点奇怪,我建议您通过删除引号将值和时间都转换为数字数据类型,就像这样

library(tidyverse)

condition <- rep(c("Pretreatment", "Normal"), 4)
value <- c(3.6, 0.2, 5.6, 0.2, 7.4, 0.2, 8.8, 0.2)
time <- c(5,5, 10, 10, 15,15, 20, 20)
domedata <- data.frame(time, condition, value)

ggplot(domedata, aes(fill=condition, x=time, y=value)) +
  geom_bar(position="dodge", stat = "identity") 

这样情节就不会那么误导了。

【讨论】:

以上是关于在 R 中保持 geom_bar() ggplot2 的数据顺序的主要内容,如果未能解决你的问题,请参考以下文章

R - ggplot - geom_bar 的圆形末端

在 R 中将 <f6> 更改为瑞典字符和相关的 ggplot geom_bar 问题

R语言ggplot2可视化时避免geom_bar对x轴进行排序实战:直接对因子变量进行提前排序后再进行可视化使用scale_x_discrete函数限定因子顺序

ggplot:在 geom_bar 的每个方面添加不同的行

R ggplot 作图

如何从 df 的不同列中获取闪避的 geom_bar (ggplot2)