ggplot 在因子水平之间插入线

use*_*485 2 r factors ggplot2

我正在 ggplot 中制作一个 tilemap,如下所示。2个问题:

1) 如何扩展 x 轴限制以在 x = 4 处标记我的组?2) 如何自动在组之间放置水平线(即 1 和 2、2 和 3 之间的线,等等),而不是手动指定 y 值?

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')
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Jan*_*yer 6

使用 facets 解决了你的两个问题:如果你 facet byGroup你可以编辑 facet 面板以在每个组周围指定一个黑色边框,它会自动标记绘图区域外的每个组。

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
Run Code Online (Sandbox Code Playgroud)

在 中facet_grid(),添加scales = "free"很重要,因此每个方面只有该组的 y 值,并添加space = free因此每个组的大小根据它有多少 y 值进行调整。

在此处输入图片说明


Rom*_*man 5

你可以尝试一个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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述