r - 在ggplot中按组堆叠发散条形图
问题描述
我正在尝试做一个这样的图表:
我们的想法是绘制 3 个数量,在这个混合堆叠条形图中,我们有一个数据框,其中一行用于负值,两行用于正值,但是我需要将负数与第一个正数条堆叠在一起,我还需要3种颜色。我到目前为止的代码如下:(数据框已经具有所需的形状):
df3 <- read.table(
text =
"region group metric somevalue
blue T1 epsilon 63
blue T2 epsilon -40
red T1 epsilon 100
blue T1 kappa 19
blue T2 kappa -30
red T1 kappa 75
blue T1 zulu 50
blue T2 zulu -18
red T1 zulu 68", header=TRUE)
p2 <- ggplot(df3, aes(x = metric, y = somevalue, fill=region))+
geom_col(aes(fill = group), width = 0.7) + geom_bar(position = 'dodge', stat='identity')
p2
请帮帮我,如果您认为必须修改数据框,请告诉我。谢谢
解决方案
堆叠和躲避总是有点棘手。在您的情况下,可以这样实现:
- 转换
region
为factor
. (这确保第 3 步有效) - 将您的数据集一分为二以获得负值和正值。
- 使用 tidy::complete 填充数据集,以便每个数据集包含度量、区域和组的“所有”组合。(这确保躲避工作
- 使用两个 geom_col 层来绘制正值和负值
position="dodge"
。我添加na.rm = TRUE
以删除我们通过添加的缺失值complete
。
library(ggplot2)
library(dplyr)
library(tidyr)
df3$region <- factor(df3$region)
df3_neg <- filter(df3, somevalue < 0) %>%
tidyr::complete(region, group, metric)
df3_pos<- filter(df3, somevalue > 0) %>%
tidyr::complete(region, group, metric)
p2 <- ggplot(df3, aes(somevalue, metric)) +
geom_col(aes(alpha = group, fill=region), data = df3_pos, position = "dodge", na.rm = TRUE) +
geom_col(aes(alpha = group, fill=region), data = df3_neg, position = "dodge", na.rm = TRUE) +
scale_fill_identity() +
scale_alpha_manual(values = c(T2 = .6, T1 = 1)) +
guides(alpha = FALSE)
p2
编辑添加注释可以以相同的方式实现,例如我下面的代码使用两个geom_text
在我使用的栏旁边添加值,position_dodge2(.9)
以便标签与栏很好地对齐:
p2 <- ggplot(df3, aes(somevalue, metric)) +
geom_col(aes(alpha = group, fill=region), data = df3_pos, position = "dodge", na.rm = TRUE) +
geom_col(aes(alpha = group, fill=region), data = df3_neg, position = "dodge", na.rm = TRUE) +
geom_text(aes(x = somevalue + 1, label = somevalue), data = df3_pos, position = position_dodge2(width = .9), hjust = 0, na.rm = TRUE) +
geom_text(aes(x = somevalue - 1, label = somevalue), data = df3_neg, , position = position_dodge2(width = .9), hjust = 1, na.rm = TRUE) +
scale_fill_identity() +
scale_alpha_manual(values = c(T2 = .6, T1 = 1)) +
guides(alpha = FALSE)
p2
EDIT2添加表确实是另一回事。在那种情况下,我会选择patchwork
这意味着制作绘图来模仿表格布局。为了使躲避工作或确保表格行与您为每个表格列绘制的条形图对齐。基本方法可能如下所示:
library(patchwork)
# 1. Make a dataframe with all combinations of region and metric using expand_grid
d_table <- expand_grid(region = unique(df3$region), metric = unique(df3$metric))
# 2. Add columns with the table content
d_table$column1 <- LETTERS[1:6]
d_table$column2 <- letters[1:6]
# 3. Make a plot for each column of the table
p_column1 <- ggplot(d_table, aes(y = metric, x = 1, label = column1)) +
geom_text(aes(group = region), position = position_dodge2(width = .9), na.rm = TRUE) +
scale_x_continuous(position = "top", breaks = 1, labels = "column1") +
labs(y = NULL, x = "") +
theme(axis.text.y = element_blank(),
axis.text.x.bottom = element_blank(),
axis.ticks = element_blank(),
plot.margin = unit(rep(0, 4), "pt"),
panel.background = element_rect(fill = NA))
p_column2 <- ggplot(d_table, aes(y = metric, x = 1, label = column2)) +
geom_text(aes(group = region), position = position_dodge2(width = .9), na.rm = TRUE) +
scale_x_continuous(position = "top", breaks = 1, labels = "column2") +
labs(y = NULL, x = "") +
theme(axis.text.y = element_blank(),
axis.text.x.bottom = element_blank(),
axis.ticks = element_blank(),
plot.margin = unit(rep(0, 4), "pt"),
panel.background = element_rect(fill = NA))
# 4. Add the table columns via patchwork
p2 + p_column1 + p_column2 + plot_layout(widths = c(1, .1, .1))
推荐阅读
- firebase - 如何使用 gcloud cli 为 Firebase 测试实验室在 yaml arg 文件中设置环境变量
- apache-spark - Spark 结构化流中的键在“GroupStateTimeout.ProcessingTimeTimeout()”完成后不会过期
- node.js - 比较大表问题
- .net - 我可以更改我的 sitemap.xml 路径的根目录吗?
- javascript - flexbox画廊动态改变div高度作为图像高度
- mysql - root 的 MYSQL 访问被拒绝(pw-reset 不起作用)
- android - Espresso 单元测试在 AWS Device Farm 上失败,但在本地运行
- html - Ionic 直到重新编译 3 次才编译
- swift - 将数据传回 UIPickerView
- java - 如何在 JEditorPane 中为 html 设置超时