ggplot中的订单列

时间:2019-12-23 21:45:56

标签: r ggplot2

我已经尝试了其他建议(Order bars in ggplotOrder Bars in ggplot2 bar graph)来订购列,但仍然无法获取。

我有一个数据集,该数据集的列名为“ Zap”,其中的值我要从出现的最高计数到最小的计数进行排序。 这是我的R代码:

mydata %>% 
  group_by(Zap) %>% 
  summarize(count = n()) %>% 
  mutate(percent = count/sum(count)) %>% 
  ggplot(aes(x=Zap, y=count, fct_infreq(Zap))) +
  xlab("EA5 Zigbee Enabled")+
  geom_col() +
  geom_text(aes(label = paste0(round(100 * percent, 1), "%")), vjust = -0.25)

该代码实际上没有重新排序任何内容。这就是我得到的(未排序)

enter image description here

我也尝试过:

mydata %>% 
  group_by(Zap) %>% 
  summarize(count = n()) %>% 
  mutate(percent = count/sum(count)) %>% 
  ggplot(aes(x=Zap, y=count)) +

  x=reorder(Zap,Zap, function(x)-count(x)) +

  xlab("EA5 Zigbee Enabled")+
  geom_col() +
  geom_text(aes(label = paste0(round(100 * percent, 1), "%")), vjust = -0.25)

但是这段代码给了我一个错误:

  

重新排序时出错(Zap,Zap,函数(x)-count(x)):对象“ Zap”   找不到

有什么想法我在做什么错吗?

3 个答案:

答案 0 :(得分:1)

您可以使用reorder(Zap, -count)作为aes的x变量的定义,按变量的数量对x变量进行排序:

mydata %>% 
  group_by(Zap) %>% 
  summarize(count = n()) %>% 
  mutate(percent = count/sum(count)) %>% 
  ggplot(aes(x=reorder(Zap, -count), y=count, fct_infreq(Zap))) +
  xlab("EA5 Zigbee Enabled")+
  geom_col() +
  geom_text(aes(label = paste0(round(100 * percent, 1), "%")), vjust = -0.25)

enter image description here

数据示例

mydata <- data.frame(Zap = c(rep("enabled",85*5),rep("enabled22",1*5),rep("disabled",14*5)))

答案 1 :(得分:0)

这是我最终使用的东西,这要感谢@HubertL的评论:

mydata %>% 
  group_by(Zap) %>% 
  summarize(count = n()) %>% 
  mutate(percent = count/sum(count), Zap = reorder(Zap, -count, FUN=identity)) %>%
  ggplot(aes(x=Zap, y=count)) +
  xlab("EA5 Zigbee Enabled")+
  geom_col() +
  geom_text(aes(label = paste0(round(100 * percent, 1), "%")), vjust = -0.25)

答案 2 :(得分:0)

fct_infreq()包中的forcats函数按频率对因数重新排序,可以代替reorder()使用。另外,ggplot2自己计算统计信息,可以通过stat()函数访问该统计信息。

因此,无需事先聚合数据。相反,可以直接从mydata数据集中创建图:

mydata <- data.frame(Zap = rep(c("enabled","enabled.22", "disabled"), 5 * c(85, 1, 14)))

library(ggplot2)

mydata %>% 
  ggplot() +
  aes(x = forcats::fct_infreq(Zap)) +
  geom_bar() + 
  geom_text(aes(y = stat(count), label = sprintf("%.1f%%", 100 * stat(count / sum(count)))), 
            stat = "count", vjust = -0.25) +
  xlab("EA5 Zigbee Enabled")

enter image description here

geom_text()需要指定ylabel美观度,它们可以使用stat()从计算出的统计数据中得出。