ggplot在因子水平之间插入线条

7
我正在使用ggplot制作一个瓷砖地图,如下所示。有两个问题: 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')

enter image description here

2个回答

6
使用facets可以解决你的两个问题:如果你按照Group进行facet,你可以编辑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

facet_grid()中,重要的是要添加scales = "free",这样每个子图仅包含该组的y值,并添加space = free使得每个组的大小根据其具有的y值数量进行调整。

enter image description here


@user42485,以下是两个建议,可以让你的绘图更符合你的要求:1)在主题中添加strip.text.y = element_text(angle = 0)。2)查看此帖子以了解如何在分面之间仅绘制水平线:https://dev59.com/2V4b5IYBdhLWcg3wzUja。另外:这里不需要使用`aes(..., label = Group)`。 - Carlos Eduardo Lagosta
@Jan-Boyer 这太好了。我不知道分面和面板间距选项中用到了空格。我已经粘贴了你的代码,但我的输出没有出现面板边框。我尝试增加大小使线条更加明显,但它们并不存在。我运行了 dev.off() 并重新启动了 R。你能想到任何可能阻止 panel.border 行起作用的原因吗? - user42485
@user42485,你使用的ggplot版本是什么?我正在运行最新的版本(3.0.0)安装;我记得在不同版本之间,一些facet主题选项的术语发生了变化。 - Jan Boyer
@user42485,如果 panel.border() 对您不起作用,一个简单的解决方法是使用其中一个内置主题,它们默认包含面板边框theme_bw()theme_linedraw() 具有黑色边框)。 - Jan Boyer

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)

enter image description here


1
这不是OP想要的。他们想要在右y轴上指定每个组之间的水平线。 - tjebo
1
@Tjebo,你说得完全正确。请看我的修改。 - Roman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接