R 如何强制变量在X轴上的特定顺序?
我的问题与使用ggplot时绘图条的顺序有关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
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))