使用两个类别中的一个的数值重新排序geom_bar图

时间:2018-01-19 17:21:10

标签: r ggplot2 geom-bar

我意识到这个问题的标题可能有点令人困惑,我想要解决的是以下内容。假设我有以下数据框:

total_cash_and_card <- data.frame(amount_type=as.character(c('cash', 'cash', 'cash', 'cash', 'cash', 'cash', 'card', 'card', 'card', 'card', 'card', 'card')),
                                user_id=as.character(c('Blah_1', 'Blah_17', 'abcd1', 'user27', 'foobar', 'scrum', 'abcd1', 'foobar', 'Blah_1', 'Blah_17', 'user27', 'scrum')), 
                                total=as.numeric(c(47,21,17,9,2,1,55,45,32,12,10,3)), 
                                stringsAsFactors=FALSE)

我制作了以下图表(使用以下代码):

g = ggplot(data=total_cash_and_card, aes(x = user_id, y = total, fill=amount_type)) +
  geom_bar(colour="black", stat="identity",
           position=position_dodge(),
           size=.3) +
  labs(x="", y="Amount", caption="(based on sample data)", title='Cash Amount vs Card Amount') +
  theme_few(base_size = 10) + 
  scale_color_few() +
  theme(axis.text.x=element_text(angle = 45, hjust = 1))
  #theme(
    #axis.text.y = element_blank())
    #axis.ticks.y = element_blank())

p = ggplotly(g)
p = layout(p, margin = m, showlegend = TRUE)
p

myplot

我如何重新排序我的绘图,以便当x轴(aka user_id)属于'card'类别(由amount_type列指示)时,根据'total'从左到右排序? (即如何重新排列我的情节,以便红色条从最大到最小,从左到右移动?)。希望我的问题足够清楚,并提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我删除了需要其他软件包的theme_fewggplotly(根据eipi10&#39的评论)。在这种情况下,您需要做的是确定您希望user_id进入的顺序,然后使用factor来应用该订单。

library(tidyverse) #for dplyr and ggplot2

order <- total_cash_and_card %>% 
  filter(amount_type == "card") %>% 
  pull(user_id)

ggplot(data=total_cash_and_card, aes(x = factor(user_id, order), y = total, fill=amount_type)) +
  geom_col(colour="black", position=position_dodge(), size=.3) +
  labs(x="", y="Amount", caption="(based on sample data)", title='Cash Amount vs Card Amount')

enter image description here