使用分面条形图进行对比

R
ggplot2
Author

Rui

Published

January 10, 2024

在上一节中,使用雷达图对各指标的得分的中位数进行了对比,其前提是各个指标的单位是统一的,这样才能放入同一个坐标系中。但如果要进行原始指标值的对比,每个指标的单位不尽相同,那么如何进行对比呢?建议对每个指标单独作图,ggplot2 中的分面可以帮我们方便地绘制一系列图表。

导入数据

Code
library(tidyverse)
library(ggplot2)
library(plotly)

data <- read.csv("data/调库前后结果对比.csv")
data %>% knitr::kable()
状态 规上工业总产值总额.亿元. 规上工业总产值增速… 实际使用外资总额.万美元. 实际使用外资增速… 制造业实际使用外资占实际使用外资比重… 进出口总额总额.万美元. 进出口总额增速… 高新技术产品进出口额总额.万美元. 高新技术产品进出口额占进出口总额比重… 每千家企业中高新技术企业数.家. 高新技术产业增加值占规上工业增加值比重… 规上工业企业研发机构设置率… 主导产业聚集度… 规上工业亩均增加值.经济密度..万元.亩. 全员劳动生产率.万元.人. 规上服务业营业收入总额.亿元.
调库前 47.01514 -9.18229 370.296 NA 51.30898 54663.64 14.18028 1100.553 2.01 NA 81.48708 22.85714 73.35178 73.18154 13.93704 6.12504
调库后 49.31307 15.04822 370.296 NA 51.30898 54663.64 14.18028 1100.553 2.01 NA 91.03546 17.39130 78.57445 73.34571 15.54998 5.27877

宽数据转成长数据:

Code
# 数据宽转长
data <- data %>% pivot_longer(cols = -状态, names_to = "指标", values_to = "值")
data %>% knitr::kable()
状态 指标
调库前 规上工业总产值总额.亿元. 47.01514
调库前 规上工业总产值增速… -9.18229
调库前 实际使用外资总额.万美元. 370.29600
调库前 实际使用外资增速… NA
调库前 制造业实际使用外资占实际使用外资比重… 51.30898
调库前 进出口总额总额.万美元. 54663.63560
调库前 进出口总额增速… 14.18028
调库前 高新技术产品进出口额总额.万美元. 1100.55310
调库前 高新技术产品进出口额占进出口总额比重… 2.01000
调库前 每千家企业中高新技术企业数.家. NA
调库前 高新技术产业增加值占规上工业增加值比重… 81.48708
调库前 规上工业企业研发机构设置率… 22.85714
调库前 主导产业聚集度… 73.35178
调库前 规上工业亩均增加值.经济密度..万元.亩. 73.18154
调库前 全员劳动生产率.万元.人. 13.93704
调库前 规上服务业营业收入总额.亿元. 6.12504
调库后 规上工业总产值总额.亿元. 49.31307
调库后 规上工业总产值增速… 15.04822
调库后 实际使用外资总额.万美元. 370.29600
调库后 实际使用外资增速… NA
调库后 制造业实际使用外资占实际使用外资比重… 51.30898
调库后 进出口总额总额.万美元. 54663.63560
调库后 进出口总额增速… 14.18028
调库后 高新技术产品进出口额总额.万美元. 1100.55310
调库后 高新技术产品进出口额占进出口总额比重… 2.01000
调库后 每千家企业中高新技术企业数.家. NA
调库后 高新技术产业增加值占规上工业增加值比重… 91.03546
调库后 规上工业企业研发机构设置率… 17.39130
调库后 主导产业聚集度… 78.57445
调库后 规上工业亩均增加值.经济密度..万元.亩. 73.34571
调库后 全员劳动生产率.万元.人. 15.54998
调库后 规上服务业营业收入总额.亿元. 5.27877

利用分面绘制条形图

Code
ggplot(data, aes(x = 指标, y = 值, fill = 状态)) +
  geom_bar(stat = "identity", position = "dodge", width = 0.3) +
  facet_wrap(指标~., scales = "free") +
  theme_bw() +
  labs(x = "", y = "") +
  theme(axis.text.x = element_blank(), # 去除分面x轴标题
        strip.text = element_text(size = 5), # 分面标题大小
        legend.title = element_blank(), # 删除图例名称
        legend.position = "bottom") # 图例位置

position 参数用于控制不同类别条形图的呈现方式。"dodge" 表示并列, "stack" 表示堆叠,"fill" 表示填满整个绘图区域(显示各类别的比例)。除此之外还可以使用 position_dodge()position_dodge2()position_stack()position_fill()position_nudge()position_jitter() 等进行精细控制。具体可见https://zhuanlan.zhihu.com/p/409489632

Code
ggplot(data, aes(x = 指标, y = 值, fill = 状态)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.5), width = 0.3) +
  facet_wrap(指标~., scales = "free") +
  theme_bw() +
  labs(x = "", y = "") +
  theme(axis.text.x = element_blank(), # 去除分面x轴标题
        strip.text = element_text(size = 5), # 分面标题大小
        legend.title = element_blank(), # 删除图例名称
        legend.position = "bottom") # 图例位置

还可以改变条形图的方向:

Code
options(repr.plot.width = 6, repr.plot.height = 8)

ggplot(data, aes(x = 指标, y = 值, fill = 状态)) +
  geom_bar(stat = "identity", position = "dodge", width = 0.3) +
  facet_wrap(~指标, nrow = 8, scales = "free") +
  theme_bw() +
  labs(x = "", y = "") +
  coord_flip() +
  theme(axis.text.x = element_text(size = 5), # 分面x轴刻度大小
        axis.text.y = element_blank(), # 去除y轴刻度
        strip.text = element_text(size = 5), # 分面标题大小
        strip.background.x = element_blank(),
        legend.title = element_blank(), # 删除图例名称
        legend.position = "bottom")

使用 plotly 中的 ggplotly() 函数将图形转换成可交互的图形:

Code
p <- ggplot(data, aes(x = 指标, y = 值, fill = 状态)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.5), width = 0.3) +
  facet_wrap(指标~., scales = "free") +
  theme_bw() +
  labs(x = "", y = "") +
  theme(axis.text.x = element_blank(), # 去除分面x轴标题
        strip.text = element_text(size = 5), # 分面标题大小
        legend.title = element_blank(), # 删除图例名称
        legend.position = "bottom") # 图例位置

plotly::ggplotly(p)