R语言绘制分类变量柱状图

Posted 基督徒Isaac

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R语言绘制分类变量柱状图相关的知识,希望对你有一定的参考价值。

  • 背景

Excel中无法实现分组区分颜色。
右边的图是我手动点击各个柱形修改分组颜色的。
请问如何在R和Excel中分别实现右图?

  • 解决:
# 数据准备 --------------------------------------------------------------------
library(tidyverse)
a <- readxl::read_excel("E:/histgram_filled_by_groups.xlsx", 
                       sheet = "Sheet2",
                       col_names = TRUE) # 如果保留行名,read.csv(row.names = 1); 代码(包括管道符号)在注释前面,否则无法运行注释后的换行内容
a <- a %>% tidyr::fill(type, .direction = "down")
a <- a %>% mutate(type = 
                    type %>% factor(levels = LETTERS[1:3]),
                  month = 
                    month %>% factor(levels = c("Jan","Feb","Mar")))
a <- a %>% arrange(type, month, value)
a %>% glimpse()

# 方法一:数据叠加 ------------------------------------------------------------------
a %>% ggplot(mapping = 
               aes(x = month,
                   y = value,
                   colour = type,
                   group = type)) + # 需提前设置分组
  geom_line() + geom_point() # 散点折线图

# 方法二:合并变量 -----------------------------------------------------------
a %>% mutate(num = 1:7) %>% # 用于给新变量排序 # 当超过十个数时,这种方法会造成排序错误!
  unite(col = type_month,
        c(num, type, month),
        sep = "_",
        remove = FALSE) %>% # 合并为新变量
  ggplot(mapping = 
           aes(x = type_month,
               y = value,
               col = type,
               group = type)) + 
  geom_line() + geom_point()

# 方法三:柱状图 -----------------------------------------------------------
a %>% mutate(num = 
               seq(from = 1, by = 1,
                   length.out = a %>% nrow())) %>% # 当超过十个数时,这种方法会造成排序错误!
  unite(col = type_month,
        c(num, type, month),
        sep = "_",
        remove = FALSE) %>%
  ggplot(mapping = 
           aes(x = type_month,
               y = value,
               col = type,
               group = type,
               fill = type)) + 
  geom_col()

# 方法四:累积柱状图 ---------------------------------------------------------------
a %>% 
  ggplot(mapping = 
           aes(x = month,
               y = value,
               col = type,
               group = type,
               fill = type)) + 
  geom_col()

  • 结果展示

  • 致谢

感谢上帝的恩典!

  真正的圣洁要求我们有两重的动机:
  透过对祂的恩典表示感恩来荣耀祂;
  透过服侍有需要的人来造福人。
  圣洁也要求行事的态度与事情的实质相符:换句话说,我们应合宜地做每一件事。

——巴刻

  • 遇到的问题及解决

问题:横坐标只能画三组,无法组内进行对比
解决:
把两组因子变量融合成一组变量*。然后再用ggplot+geom_col()画图就好啦

更新:
*错误:创建一个1:n的序列,作为变量名的开头,会导致十位数跑到2、3、4等个位数的前面,所以不能这么做!!
R语言中对字符型数据有默认的排序方法,所以一般采用行列索引进行循环。如果要直接对字符型数据进行排序,需要按照对应的排序规则调用相关函数。
一般都是提取字符串中的数字,再按照数字进行排序。
解决方法:mutate创建了一个数字向量作为横坐标,然后再用原始数据paste成新字符向量作为横坐标标签覆盖上去。
例如:
mutate(num = 1:nrow(data), v1_v2 = paste…)
mutate(num = 1:nrow(data)); unite(v1_v2, c( v1,v2 ))

问题:将字符向量转化为因子向量
解决:检查格式自定义factor函数的水平levels

问题:geom_histogram错误:stat_bin() can only have an x or y aesthetic.
解决:直方图(geom_histogram)与柱形图有区别。

柱状图有geom_bar() 和 geom_col():
geom_bar() 经过统计变换(count, …prop…);
geom_col()不经过统计变换,代表的就是该分类变量的实际值。
参考资料:https://www.jianshu.com/p/05391806ab80

问题:处理合并单元格和缺失值
解决:
处理合并单元格:
openxlsx::read.xlsx(fillMergedCells = TRUE) # 填充所拆散的合并单元格
处理拆散单元格(向下填充缺失值):
tidyr::fill(type, .direction = “down”) # 向下填充

  • 其他
    请问有人知道如何在Excel中自动化实现吗?

以上是关于R语言绘制分类变量柱状图的主要内容,如果未能解决你的问题,请参考以下文章

R语言ggplot2可视化:可视化离散(分类)变量的堆叠的柱状图横轴是离散变量柱状图是多个分组的计数和叠加

R语言ggplot2可视化:可视化华夫饼图(Waffle Chart)饼图柱状图Treemap图可视化离散(分类)变量的堆叠的柱状图横轴是离散变量柱状图是多个分组的计数和叠加

FigDraw 5. SCI 文章绘图之柱状图 (Barplot)

R语言绘图——条形图/柱状图

R语言ggplot2可视化百分比显示实战:纵轴显示为百分比在柱状图上显示百分比按照因子变量绘制分组子图(纵轴显示为百分比)可视化图中显示数据百分比

R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(双分类变量分组:色彩配置形状配置)实战