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

R 如何强制变量在X轴上的特定顺序?,r,ggplot2,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

我的问题与使用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)
在半焦效应中,钢筋高度不符合顺序。如何强制效应名称的顺序与半个效应的降序相匹配?这可以在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
更详细地说,可以使用Hadley的
forcats
包方便地完成级别的重新排序。此外,可以在调用
aes()
的过程中进行重新排序,而不是操纵底层数据。这为找到合适的图形显示提供了额外的灵活性

初始图

  • 因子按其在向量中的第一次出现顺序排列(这可能是OP根据
    Half_Effect
    的值故意选择的,因此这里没有真正的惊喜。)
  • 在本例中,
    fct\u inoorder()
    可以避免我们在调用
    factor
    时需要两次键入相同的内容
  • p
    仅通过改变
    x
    美学进行修改。底层数据无需触摸
根据另一个变量重新排列级别

在这里,通过增加
半_效应的值来排列级别。我们可以通过从基R使用
reorder()
而不是
fct\u reorder()
来实现相同的效果

要按照OP的要求按降序显示级别,我们可以执行以下操作

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


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

Effect是因子类型,您可以先将其转换为数值,只需执行
paretoData=data.frame(EffectNames,Effect)
并跳过
cbind
步骤。此处有两个选项:如果您希望以
Effect
的数字顺序绘制数据,可以执行
ggplot(paretoData,aes(x=reorder(EffectNames,Effect),y=Effect))
。对于任意顺序的
EffectNames
,在创建数据帧后,按所需顺序设置因子级别。例如,
paretoda$EffectNames=factor(paretoda$EffectNames,levels=c(“AB”、“AC”、“Hook(B)”等))
。然后运行原始的绘图代码。这两个建议产生了不同。非常感谢。Mary A.Maria可选地,可以使用
比例x离散
library(forcats)
p + aes(x = fct_inorder(EffectNames))
p + aes(x = fct_reorder(EffectNames, Half_Effect))
p + aes(x = fct_reorder(EffectNames, Half_Effect, .desc = TRUE))