如何用ggplot2绘制仅含非零值的柱状图?R编程技术问询
用ggplot2实现非零值柱状图的方法
首先,ggplot2依赖结构化的数据框,我们可以从你已生成的graph1表格出发,或者直接从原始数据框df处理,两种方法都给你:
方法1:基于你已生成的graph1表格
先把表格转成ggplot能识别的数据格式,再筛选非零值:
# 加载工具包(没装过先运行install.packages("tidyverse")) library(tidyverse) # 将table转为数据框,筛选x第一个水平的非零计数 plot_data <- as.data.frame(graph1) %>% filter(Var1 == rownames(graph1)[1], Freq != 0) # 绘制柱状图 ggplot(plot_data, aes(x = Var2, y = Freq)) + geom_col(fill = "cornflowerblue") + # 已有计数时用geom_col更合适 labs(x = "变量y", y = "计数", title = "x第一个水平下y的非零计数") + theme_bw()
方法2:直接从原始数据框df处理(更推荐)
跳过生成table的步骤,直接对原始数据统计筛选,更贴合ggplot的工作流:
library(tidyverse) # 从原始数据提取x第一个水平的y的非零计数 plot_data <- df %>% filter(x == levels(df$x)[1]) %>% # 锁定x的第一个分类水平 count(y) %>% # 统计每个y的出现次数 filter(n != 0) # 排除计数为0的情况 # 绘图 ggplot(plot_data, aes(x = y, y = n)) + geom_col() + labs(x = "y", y = "计数") + theme_minimal()
补充说明
- 你原来的
barplot只取了graph1[1, ],也就是x的第一个分类水平对应的y的计数,上面的代码都保留了这个逻辑;如果要展示x所有水平的非零计数,去掉filter(x == levels(df$x)[1])即可。 geom_col和geom_bar(stat = "identity")效果完全一致,任选其一就行。
内容的提问来源于stack exchange,提问作者Julius Julius
相关产品推荐
相关产品推荐

