---
title: "使用分面条形图进行对比"
author: "Rui"
date: "2024-01-10"
categories: [R, ggplot2]
image: "chrysanthemum_2.jpg"
format:
html:
code-fold: true
code-tools: true
---
```{r setup, include = FALSE}
# 设置默认参数
knitr::opts_chunk$set(
echo = TRUE,
fig.align = "center",
message = FALSE,
warning = FALSE,
collapse = TRUE
)
```
在上一节中,使用雷达图对各指标的得分的中位数进行了对比,其前提是各个指标的单位是统一的,这样才能放入同一个坐标系中。但如果要进行原始指标值的对比,每个指标的单位不尽相同,那么如何进行对比呢?建议对每个指标单独作图,`ggplot2` 中的分面可以帮我们方便地绘制一系列图表。
## 导入数据
```{r}
library(tidyverse)
library(ggplot2)
library(plotly)
data <- read.csv("data/调库前后结果对比.csv")
data %>% knitr::kable()
```
## 宽数据转成长数据:
```{r}
# 数据宽转长
data <- data %>% pivot_longer(cols = -状态, names_to = "指标", values_to = "值")
data %>% knitr::kable()
```
## 利用分面绘制条形图
```{r}
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>
```{r}
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") # 图例位置
```
还可以改变条形图的方向:
```{r}
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()` 函数将图形转换成可交互的图形:
```{r}
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)
```