我正在尝试将我的数据绘制为具有3个级别(“catg”)的堆积条,但我希望X轴上的类别按其“低”子类别的值按升序排列,
这是繁殖的例子:
#creating df:
set.seed(33)
df<-data.frame(value=runif(12),
catg=factor(rep(c("high","medium","low")),
levels = c("high","medium","low")),
var_name=(c(rep("question1",3),rep("question2",3),rep("question3",3),rep("question4",3)))
#plotting
bar_dist<-ggplot(df,aes(x=var_name,
y=value,
fill=catg,
label=round(value,2)))
bar_dist+ geom_bar(stat = "identity",
position = "dodge",
width = 0.7)+
coord_flip() +
xlab("questions")+
ylab("y")+
geom_text(size = 4,position=position_dodge(width = 0.7))
这是我目前的情节:
所以在这种情况下我应该有问题3然后是4,1,最后是2。 每一个帮助都会得到欣赏,
答案 0 :(得分:2)
一种方法可能是:
df$var_name=factor(df$var_name,levels=rev(levels(reorder(df[df$catg=="low",]$var_name,df[df$catg=="low",]$value))))
根据理查德·特尔福德的建议使用reorder()
,在过滤df$value
后仅根据df
重新排序级别,仅保留"low"
。
levels()
用于从上一个函数中提取级别
rev()
用于反转级别
factor()
将级别重新分配到df$var_name
或:
df$var_name=factor(df$var_name,levels = df[with(df,order(value,decreasing = T)) ,][df[with(df,order(value,decreasing = T)) ,]$catg=="low",]$var_name)
它对df
df$value
进行排序(降低值),df$catg
对"low"
进行过滤,并检索df$var_name
,factor()
用作CanBuildFrom
中的级别1}}。
然后使用相同的绘图功能:
答案 1 :(得分:1)
使用fct_reorder2()
库中的forcats
修改数据框的解决方案:
library(forcats)
bar_dist <- ggplot(df,
aes(
x = fct_reorder2(var_name, catg, value),
y = value, fill = catg,
label = round(value, 2)))
bar_dist + geom_bar(stat = "identity",
position = "dodge",
width = 0.7) +
coord_flip() +
xlab("questions") +
ylab("y") +
geom_text(size = 4, position = position_dodge(width = 0.7))