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

时间:2016-10-23 03:39:04

标签: 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")

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

1.6 0.65 0.77 0.98    6.5    5.6        10.4
 AB  ABC   AC   BC Hook(B) Peg(C) PullBack(A)

在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

1 个答案:

答案 0 :(得分:15)

阐述eipi10's comment,可以使用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

enter image description here

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

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

library(forcats)
p + aes(x = fct_inorder(EffectNames))

enter image description here

  • 这些因素是按照它们在向量中的首次出现来排序的(这可能是由OP在Half_Effect的值上有意选择的,因此这里没有真正的意外。)
  • 在此示例中,fct_inorder()使我们无需键入两次相同的内容,这在明确指定factor调用中的级别时是必需的。
  • 仅通过更改p美学来修改情节x。无需触及基础数据。

根据另一个变量

重新排序等级
p + aes(x = fct_reorder(EffectNames, Half_Effect))

enter image description here

此处,通过增加Half_Effect的值来排序级别。通过使用基础R中的reorder()代替fct_reorder(),我们可以达到相同的效果。

要按照OP 的要求按降序显示级别,我们可以

p + aes(x = fct_reorder(EffectNames, Half_Effect, .desc = TRUE))

enter image description here

请注意reorder() no 显式参数来反转顺序,因此我们需要修改控制变量reorder(EffectNames, -Half_Effect)