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)