如何在R中以降序绘制每列

时间:2017-04-12 03:10:59

标签: r ggplot2

我打算以降序绘制数据框中的每个分类列,取决于变量中的级别频率。

我已经找到了如何绘制每一列并重新排序等级,但我无法弄清楚如何将它们组合在一起。你能给我一些建议吗?

每栏的情节代码:

MERGE  FundRel FR
USING #FundTemp Tmp
 ON (FR.DataSourceFundName = Tmp.DataSourceFundName AND FR.PortFolioID = 
Tmp.PortFolioID AND FR.DataSourceID = Tmp.DataSourceID)
WHEN MATCHED THEN
  UPDATE  SET  FR.DataSourceFundName = Tmp.NewDataSourceFundName
  , FR.CodeRedFundName = Tmp.NewCodeRedFundName
  , FR.AssetClassID = Tmp.AssetClassID
  , FR.SubAssetClassID = Tmp.SubAssetClassID
   , FR.StrategyID = Tmp.StrategyID
 , FR.SubStrategyID = Tmp.SubStrategyID

WHEN NOT MATCHED BY TARGET THEN
 INSERT ([PortfolioID]
  ,[DataSourceID]
  ,[PrimaryFundID]
  ,[DataSourceFundName]
  ,[FundNumber]
  ,[AssetClassID]
  ,[SubAssetClassID]
  ,[StrategyID]
  ,[SubStrategyID]
  ,[CodeRedFundName])
  VALUES (Tmp.[PortfolioID]
  ,Tmp.[DataSourceID]
  ,Tmp.[PrimaryFundID]
  ,Tmp.[DataSourceFundName]
  ,Tmp.FundCode
  ,Tmp.[AssetClassID]
  ,Tmp.[SubAssetClassID]
  ,Tmp.[StrategyID]
  ,Tmp.[SubStrategyID]
  ,Tmp.[CodeRedFundName]);

重新排序一个变量级别的代码:

require(purrr)
library(tidyr)
library(ggplot2)


diamonds %>% 
  keep(is.factor) %>%
  gather() %>%
  ggplot(aes(value)) +
  facet_wrap(~ key, scales = "free") +
  geom_bar()  
顺便说一下,如果您觉得编写这些代码有更好的方法,请告诉我。 感谢。

2 个答案:

答案 0 :(得分:1)

您的方法存在的问题是数据框的长形式会引入许多因素,这些因素将被绘制为geom_bar()的0。

不是依赖facet_wrap和处理长数据形式,而是替代方案。

按尺寸功能重新排序:

reorder_size <- function(x) {
  factor(x, levels = names(sort(table(x), decreasing=T)))
}

使用gridExtra::grid.arrange函数提供类似的facet_wrap样式图:

library(gridExtra)
a <- ggplot(diamonds, aes(x=reorder_size(cut))) + geom_bar()
b <- ggplot(diamonds, aes(x=reorder_size(color))) + geom_bar()
c <- ggplot(diamonds, aes(x=reorder_size(clarity))) + geom_bar()
grid.arrange(a,b,c, nrow=1)

enter image description here

答案 1 :(得分:1)

备选方案1

无需使用gridExtra模拟facet_wrap,只需在reorder_size内加入aes功能:

reorder_size <- function(x) {
  factor(x, levels = names(sort(table(x), decreasing = TRUE)))
}

diamonds %>% 
  keep(is.factor) %>%
  gather() %>%
  ggplot(aes(x = reorder_size(value))) +
  facet_wrap(~ key, scales = "free") +
  geom_bar()  

备选方案2

使用dplyr按键和值计算计数分组。然后我们按reorder内的计数降序排列值aes

library(dplyr)
diamonds %>% 
  keep(is.factor) %>%
  gather() %>%
  group_by(key,value) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = reorder(value, -n), y = n)) +
  facet_wrap(~ key, scales = "free") +
  geom_bar(stat='identity') 

<强>输出 enter image description here