ggplot 在因子水平之间插入线
ggplot insert line between factor levels
我正在 ggplot 中制作一个 tilemap,如下所示。 2 个问题:
1) 如何扩展 x 轴限制以在 x = 4 处标记我的组?
2) 如何在不手动指定 y 值的情况下自动在组之间放置水平线(即 1 和 2、2 和 3 之间的线等)?
require(tidyverse)
set.seed(1)
df <- data.frame(ID = as.character(c(1:50)),
Group = sample(1:8, 50, replace = T),
var1 = sample(c('Y', 'N'), 50, replace = T),
var2 = sample(c('Y', 'N'), 50, replace = T),
var3 = sample(c('Y', 'N'), 50, replace = T)) %>%
gather('var', 'y_n', var1:var3) %>%
arrange(-Group) %>%
mutate(ID = factor(ID, levels = unique(ID, ordered = T)))
ggplot(df, aes(var, ID, label = Group))+
geom_tile(aes(fill = y_n), color = 'white')+
scale_fill_manual(values = c('white', 'lightblue'))+
scale_x_discrete(expand = c(0, 0))+
geom_text(x = 3.5, hjust = 'right')
您可以尝试 geom_hline
方法。还添加了用于演示目的的垂直线。
# calculate the group numbers
gr <- df %>%
group_by(Group) %>%
summarise(n=length(unique(ID))) %>%
arrange(-Group) %>%
mutate(nn=cumsum(n))
ggplot(df, aes(var, ID, label = Group))+
geom_tile(aes(fill = y_n), color = 'white')+
scale_fill_manual(values = c('white', 'lightblue'))+
scale_x_discrete(expand = c(0, 0))+
geom_text(x = 3.5, hjust = 'right') +
geom_vline(xintercept = 1:length(unique(df$var))+0.5)+
geom_hline(yintercept = gr$nn+0.5)
使用分面可以解决您的两个问题:如果您按 Group
分面,您可以编辑分面面板以指定每个组周围的黑色边框,它会自动在绘图区域外标记每个组。
ggplot(df, aes(var, ID, label = Group)) +
geom_tile(aes(fill = y_n), color = 'white') +
scale_fill_manual(values = c('white', 'lightblue')) +
scale_x_discrete(expand = c(0, 0)) +
facet_grid(Group~., scales = "free", space = "free") + #facet by group
theme(strip.background = element_blank(), #remove background for facet labels
panel.border = element_rect(colour = "black", fill = NA), #add black border
panel.spacing = unit(0, "lines")) #remove space between facets
在 facet_grid()
中,添加 scales = "free"
很重要,这样每个方面都只有该组的 y 值,添加 space = free
以便根据需要调整每个组的大小关于它有多少个 y 值。
我正在 ggplot 中制作一个 tilemap,如下所示。 2 个问题:
1) 如何扩展 x 轴限制以在 x = 4 处标记我的组? 2) 如何在不手动指定 y 值的情况下自动在组之间放置水平线(即 1 和 2、2 和 3 之间的线等)?
require(tidyverse)
set.seed(1)
df <- data.frame(ID = as.character(c(1:50)),
Group = sample(1:8, 50, replace = T),
var1 = sample(c('Y', 'N'), 50, replace = T),
var2 = sample(c('Y', 'N'), 50, replace = T),
var3 = sample(c('Y', 'N'), 50, replace = T)) %>%
gather('var', 'y_n', var1:var3) %>%
arrange(-Group) %>%
mutate(ID = factor(ID, levels = unique(ID, ordered = T)))
ggplot(df, aes(var, ID, label = Group))+
geom_tile(aes(fill = y_n), color = 'white')+
scale_fill_manual(values = c('white', 'lightblue'))+
scale_x_discrete(expand = c(0, 0))+
geom_text(x = 3.5, hjust = 'right')
您可以尝试 geom_hline
方法。还添加了用于演示目的的垂直线。
# calculate the group numbers
gr <- df %>%
group_by(Group) %>%
summarise(n=length(unique(ID))) %>%
arrange(-Group) %>%
mutate(nn=cumsum(n))
ggplot(df, aes(var, ID, label = Group))+
geom_tile(aes(fill = y_n), color = 'white')+
scale_fill_manual(values = c('white', 'lightblue'))+
scale_x_discrete(expand = c(0, 0))+
geom_text(x = 3.5, hjust = 'right') +
geom_vline(xintercept = 1:length(unique(df$var))+0.5)+
geom_hline(yintercept = gr$nn+0.5)
使用分面可以解决您的两个问题:如果您按 Group
分面,您可以编辑分面面板以指定每个组周围的黑色边框,它会自动在绘图区域外标记每个组。
ggplot(df, aes(var, ID, label = Group)) +
geom_tile(aes(fill = y_n), color = 'white') +
scale_fill_manual(values = c('white', 'lightblue')) +
scale_x_discrete(expand = c(0, 0)) +
facet_grid(Group~., scales = "free", space = "free") + #facet by group
theme(strip.background = element_blank(), #remove background for facet labels
panel.border = element_rect(colour = "black", fill = NA), #add black border
panel.spacing = unit(0, "lines")) #remove space between facets
在 facet_grid()
中,添加 scales = "free"
很重要,这样每个方面都只有该组的 y 值,添加 space = free
以便根据需要调整每个组的大小关于它有多少个 y 值。