ggplot facet_wrap,轴间距相等

时间:2018-05-03 10:46:11

标签: r ggplot2 axis facet-wrap

假设我有以下虚拟数据框:

df <- data.frame(let = LETTERS[1:13], value = sample(13), 
group = rep(c("foo", "bar"), times = c(5,8)))

df
  let value group
1    A     2   foo
2    B     1   foo
3    C    12   foo
4    D     8   foo
5    E     4   foo
6    F    13   bar
7    G    11   bar
8    H     3   bar
9    I     7   bar
10   J     5   bar
11   K    10   bar
12   L     9   bar
13   M     6   bar

使用ggplot和facet_wrap可以为每个组制作一个面板......

library(ggplot2)
ggplot(df, aes(x= let, y = value)) + 
geom_point() + 
coord_flip() +
facet_wrap(~group, scales = "free")

enter image description here

..但是垂直轴不是等间隔的,即左图包含比右图更多的垂直刻度。我想用(未标记的)刻度填充右侧垂直轴(没有绘制值)。在这种情况下,它会添加3个空标记,但它应该可以扩展到任何df大小。

实现这一目标的最佳方法是什么?我应该更改数据框,还是有办法使用ggplot?

3 个答案:

答案 0 :(得分:2)

需要magrittr的cludgy解决方案(对于复合赋值管道%<>%):

df %<>% 
  rbind(data.frame(let = c(" ", "  ", "   "), 
                   value = NA, 
                   group = "foo"))

enter image description here

我只为foo添加三个不同长度的空字符串(即空格)。但是,必须有一个更优雅的解决方案。

答案 1 :(得分:2)

我不确定为什么你要在图表上排列分类变量,而不是美学(它看起来似乎更好)。无论如何,似乎处理一般情况的简单解决方法是注意ggplot使用数字刻度来绘制分类变量。然后,对于每个x值,您的图表的变通方法是在y值处绘制一个等于分类变量数的透明点。针对所有x值绘制点,作为针对每个组的x值的非重叠范围的情况的简单解决方案。我已经在您的数据框中添加了另一个组,以使示例更加通用。

library(ggplot2)
set.seed(123)
df <- data.frame(let = LETTERS[1:19], value = c(sample(13),20+sample(6)), 
             group = rep(c("foo", "bar", "bar2"), times = c(5,8,6)))
num_rows <- xtabs(~ group, df)
max_rows <- max(num_rows)

sp <- ggplot(df, aes(y= let, x = value)) + 
      geom_point() + 
      geom_point(aes(y = max_rows +.5), alpha=0 ) +
      facet_wrap(~group, scales = "free", nrow=1 )
plot(sp)

这给出了以下图表:enter image description here

答案 2 :(得分:0)

使用free_x代替free,如下所示:

ggplot(df, aes(x= let, y = value)) + 
  geom_point() + 
  coord_flip() +
  facet_wrap(~group, scales = "free_x")+
  theme(axis.text.y=element_blank(),
        axis.ticks.y=element_blank())