前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >65-R茶话会14-柱状图用col还是bar,你可以省一点空间

65-R茶话会14-柱状图用col还是bar,你可以省一点空间

作者头像
北野茶缸子
发布2021-12-17 11:01:51
8480
发布2021-12-17 11:01:51
举报

参考:

geom_col or geom_bar

二者唯一的区别在于,col 的stat 参数是identity。因此如果使用geom_bar 指定stat = "identity",二者是没有区别的。

指定了这个参数意味着什么呢?

意味着我们可以给y 指定一个自定义的数值,而非让ggplot 函数转化我们的数据框去计数。

比如你有一个数据:

代码语言:javascript
复制
iris2 <- iris
iris2$group <- sample(c("a","b","c"), 150, replace = T)
> str(iris2)
'data.frame': 150 obs. of  6 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ group       : chr  "b" "a" "b" "c" ...

如果你进行如下绘图:

代码语言:javascript
复制
ggplot(iris2) + geom_bar(aes(Species, fill = group))

但其实我们完全可以自己计算一个数据框:

代码语言:javascript
复制
> iris2_count <- iris2 %>% 
+   group_by(Species, group) %>%
+   summarise(count = n())
`summarise()` has grouped output by 'Species'. You can override using the `.groups` argument.
> iris2_count
# A tibble: 9 x 3
# Groups:   Species [3]
  Species    group count
  <fct>      <chr> <int>
1 setosa     a        18
2 setosa     b        18
3 setosa     c        14
4 versicolor a        12
5 versicolor b         9
6 versicolor c        29
7 virginica  a        13
8 virginica  b        22
9 virginica  c        15

接下来直接用geom_col 就好了:

代码语言:javascript
复制
ggplot(iris2_count) + geom_col(aes(x = Species, y = count, fill = group), 
                         position = "dodge")

节约了多少空间呢

代码语言:javascript
复制
> object.size(iris2)
8728 bytes
> object.size(iris2_count)
4816 bytes

这还不够刺激。我们翻个倍吧,100倍如何?

代码语言:javascript
复制
enlargeDf <- function(df,df2,n) {
  if (n > 1){
    df <- rbind(df, df2)
    enlargeDf(df,df2,n - 1)
  } else {
    df <- df
  }
}
iris_big <- enlargeDf(iris2, iris2, 100)
dim(iris_big)
[1] 15000     6

画个图:

代码语言:javascript
复制
iris_big_count <- iris_big %>% 
  group_by(Species, group) %>%
  summarise(count = n())

a1 <- object.size(iris_big_count)
a2 <- object.size(iris_big)
aa <- data.frame(
  V1 = c("a1","a2"),
  V2 = c(as.numeric(a1), as.numeric(a2))
)

ggplot(aa, aes(V1, V2, label = V2, fill = V1)) + 
  geom_col() + 
  geom_text(vjust = -0.8) 

这里还仅仅是一万五千行数据框,动辄十几万或者上百万的数据框呢?

转换后的文件不仅方便我们读取和传送,而且从数据的阅读直观程度来看,统计转化的结果也更容易传播。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-11-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 北野茶缸子 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 节约了多少空间呢
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档