如何在X轴上强制变量的特定顺序?

Mar*_*ion 9 r ggplot2

我的问题与使用ggplot时绘图条的顺序有关.

EffectNames = c("Pull Back(A)","Hook(B)","Peg(C)","AB","BC","AC","ABC")
Half_Effect = c(10.4, 6.5, 5.6, 1.6, 0.98, .77, .65)
paretoData = cbind(EffectNames, Half_Effect)
paretoData = as.data.frame(paretoData)

ggplot(paretoData, aes(x = EffectNames, y = Half_Effect)) +
    geom_bar(stat = "identity") +
    geom_text(aes(label = Half_Effect), vjust = 1.5, colour = "white")
Run Code Online (Sandbox Code Playgroud)

结果:条形高度按以下顺序排列

1.6 0.65 0.77 0.98    6.5    5.6        10.4
 AB  ABC   AC   BC Hook(B) Peg(C) PullBack(A)
Run Code Online (Sandbox Code Playgroud)

在Half_Effect中看不到条形高度.如何强制EffectNames的排序以匹配Half_Effect的降序?这可以在ggplot2中完成吗?是的,它可以!见下面的解决方案

EffectNames=c( "Pull Back(A)","Hook(B)", "Peg(C)","AB", "BC", "AC", "ABC")
Half_Effect=c( 10.4,6.5,5.6,1.6,0.98,.77,.65 )
paretoData=data.frame(EffectNames, Half_Effect)
paretoData
paretoData$EffectNames = factor(paretoData$EffectNames, 
    levels=c("Pull Back(A)","Hook(B)", "Peg(C)","AB", "BC", "AC", "ABC"))
p=ggplot(paretoData, aes(x=EffectNames, y=Half_Effect)) +
geom_bar(stat="identity") +
geom_text(aes(label=Half_Effect), vjust=1.5, colour="white")
p
Run Code Online (Sandbox Code Playgroud)

Uwe*_*Uwe 16

通过阐述eipi10的评论,可以使用Hadley的forcats软件包方便地完成对级别的重新排序.此外,重新排序可以在调用内完成,aes()而不是操纵底层数据.这为寻找合适的图形显示提供了额外的灵活性.

初始情节

paretoData <-  data.frame(
  EffectNames = c("Pull Back(A)", "Hook(B)", "Peg(C)", "AB", "BC", "AC", "ABC"), 
  Half_Effect = c(10.4, 6.5, 5.6, 1.6, 0.98, .77, .65))

library(ggplot2)
p <- ggplot(paretoData, aes(x = EffectNames, y = Half_Effect)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = Half_Effect), vjust = 1.5, colour = "white")
p
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

此处,默认情况下,订单按字母顺序排列.

按照首次出现的顺序对级别重新排序

library(forcats)
p + aes(x = fct_inorder(EffectNames))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 这些因子是按照它们在向量中的第一次出现来排序的(这可能是由OP有意识地选择的Half_Effect,因此这里没有真正的惊喜.)
  • 在这个例子中,fct_inorder()节省我们两次输入相同的东西,这在明确指定调用中的级别时是必需的factor.
  • p仅通过改变x美学来修改情节.无需触及基础数据.

根据另一个变量重新排序级别

p + aes(x = fct_reorder(EffectNames, Half_Effect))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在这里,水平是通过增加值来排序的Half_Effect.我们可以通过使用reorder()基数R而不是使用来实现相同的效果fct_reorder().

按照OP的要求按降序显示水平,我们可以做

p + aes(x = fct_reorder(EffectNames, Half_Effect, .desc = TRUE))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

请注意,reorder()没有明确的参数顺序颠倒,所以我们就需要修改控制变量reorder(EffectNames, -Half_Effect).