R 设置/重新排序系数级别在ggplot(条形图)中不起作用

R 设置/重新排序系数级别在ggplot(条形图)中不起作用,r,ggplot2,R,Ggplot2,我试图按停留的顺序创建条形图。我使用了重新排序和因子,但图中条形的顺序没有改变。这是一个可复制的例子 library(ggplot2) speed <- c(300, 75, 100, 200, 150, 225, 75, 300, 150, 75, 200, 150, 225, 75, 350, 75, 300, 150, 150, 200, 225, 150, 75, 300, 100, 350, 100, 225, 350, 225, 150, 225, 200, 150) stay

我试图按
停留
的顺序创建条形图。我使用了
重新排序
因子
,但图中条形的顺序没有改变。这是一个可复制的例子

library(ggplot2)
speed <- c(300, 75, 100, 200, 150, 225, 75, 300, 150, 75, 200, 150, 225, 75, 350, 75, 300, 150, 150, 200, 225, 150, 75, 300, 100, 350, 100, 225, 350, 225, 150, 225, 200, 150)
stay <- c(0, runif(n = length(speed) - 1, min = 0, max = 25))
Vol <- c(0, 25, rnorm(n = length(speed) - 2, mean = -40, sd = 20))
Death <- sample(0:1, size = length(speed), replace = T)
fig.data <- data.frame(driver = 1:length(speed), speed = speed, stay = stay, Vol = Vol, Death = Death)
fig.data$speed <- as.factor(fig.data$speed)

# solution 1 (not work): use factor ------------------------------------------------------
# fig.data$driver <- factor(fig.data$driver, levels = order(-fig.data$stay))

# solution 2 (not work): use reorder -----------------------------------------------------
# fig.data$driver <- reorder(fig.data$driver, -fig.data$stay)

# solution 3 (work!): order the data frame -----------------------------------
# fig.data <- fig.data[order(-stay),]
第一个
驱动程序
具有最低的
停留时间
,因此此条应位于图的顶部。为了方便起见,我使用“X”标记了此驱动程序。然而,解决方案1和2都给出了这个问题

我所期望的是,(使用解决方案3)

我是否误解了前两种解决方案

更新

查看发布的问题后,我发现原因是我在
scale\x\u discrete
中使用了
limits=fig.data$driver
breaks=fig.data$driver
。但是,对于解决方案1,我应该使用
limits=levels(图data$driver)
breaks=levels(图data$driver)

一些相关问题:


  • 不要在解决方案1和2中使用
    scale\u x\u discrete()
    。默认情况下,ggplot将根据因子的级别对轴标签进行排序(如果轴是因子)。使用
    scale\u x\u discrete()时,它将覆盖正确的顺序。

    库(ggplot2)
    图书馆(dplyr)
    #> 
    #>正在附加包:“dplyr”
    #>以下对象已从“package:stats”屏蔽:
    #> 
    #>滤波器,滞后
    #>以下对象已从“package:base”屏蔽:
    #> 
    #>相交、setdiff、setequal、并集
    
    速度按照建议,我在这里发布我的答案


    查看发布的问题后,我发现原因是我在
    scale\x\u discrete
    中使用了
    limits=fig.data$driver
    breaks=fig.data$driver
    。但是,对于解决方案1,它们应该是
    limits=levels(fig.data$driver)
    breaks=levels(fig.data$driver)

    如果您找到了问题的答案,那么最好将其作为答案发布,而不是作为问题发布。@Ronaksha将编辑我的问题并将其作为答案发布。谢谢你的建议。
    ggplot(data = fig.data, aes(x = driver, y = Vol)) +
      geom_col(aes(fill = speed), width = 0.5) +
      geom_point(data = fig.data %>% filter(Vol == 0),
                 shape = 4,
                 position = position_nudge(y = 0),
                 size = 2,
                 show.legend = FALSE) +
      geom_hline(yintercept = round(mean(Vol), 0)) +
      scale_x_discrete(limits = fig.data$driver,
                       breaks = fig.data$driver) +
      scale_y_continuous(limits = c(-100, 100), 
                         breaks = c(seq(-100,100,20), round(mean(fig.data$Vol), 0)),
                         minor_breaks = NULL) +
      coord_flip() + 
      guides(fill = FALSE)