2016-09-16 193 views
6

我在ggplot2中制作条形图,出于演示的原因,我需要在我的一些条形图之间有空格。我在scale_x_discrete中使用限制来插入空白条,这给了我需要的空白。删除R中ggplot2中的单个x轴刻度标记?

在我的模拟数据组bc之间的差距看起来很完美,但ab之间的差距仍然有黑色刻度和背景中的白线。我不需要任何x轴网格线,所以我可以很容易地解决白线的问题,但我无法弄清楚如何摆脱刻度线。

我,使用R版本3.3.1(2016年6月21日) - “虫在你的头发”,在RStudio工作和代码需要GGPLOT2

### Mock data with the same structure as mine 
my.data <- data.frame(x = rep(c("a", "b", "c", "d"), 3), 
         y = c("e", "f", "g")) 

### Make graph 
ggplot(my.data, aes(x = x, fill = y)) + 
    geom_bar(position = "fill") + 
    scale_x_discrete(limits = c("a", "", "b", "", "c", "d")) 

### Remove white line in background by removing all x grid lines 
ggplot (my.data, aes(x = x, fill = y)) + 
    geom_bar(position = "fill") + 
    scale_x_discrete(limits = c("a", "", "b", "", "c", "d")) + 
    theme(panel.grid.minor.x = element_blank(), 
      panel.grid.major.x = element_blank()) 

如何删除黑在ab之间勾选标记?

如果我需要改变插入条之间的空间的方式,我该如何做,并维护图结构?

Image showing white x-axis line and black tick mark

回答

6

可以做你问通过什么黑客:如果您使用的第一个值"a"更换空白limits,ggplot将放置在第一次出现在酒吧和留给下一代那些空白:

my.data <-data.frame (x=rep(c("a", "b", "c", "d"),3), 
         y=c("e", "f", "g")) 

ggplot(my.data, aes(x=x, fill = y)) + 
    geom_bar(position = "fill") + 
    scale_x_discrete(limits = c("a", "a", "b", "a", "c", "d")) 

hacked plot

然而,分隔变量的方法是通过分面,这需要一个变量来定义你想要的分组,例如,

library(dplyr) 

      # create with your favorite grammar 
my.data %>% mutate(grp = case_when(.$x == 'a' ~ 1, 
            .$x == 'b' ~ 2, 
            TRUE ~ 3)) 
#> x y grp 
#> 1 a e 1 
#> 2 b f 2 
#> 3 c g 3 
#> 4 d e 3 
#> 5 a f 1 
#> 6 b g 2 
#> 7 c e 3 
#> 8 d f 3 
#> 9 a g 1 
#> 10 b e 2 
#> 11 c f 3 
#> 12 d g 3 

,你可以传递给ggplot用于磨制:

my.data %>% mutate(grp = case_when(.$x == 'a' ~ 1, 
            .$x == 'b' ~ 2, 
            TRUE ~ 3)) %>% 
    ggplot(aes(x, fill = y)) + 
    geom_bar(position = 'fill') + 
    facet_grid(. ~ grp, space = 'free_x', scales = 'free_x') 

facetted plot

+2

另一个 “哈克” 的方式做到这一点是添加像这样到了'theme':'轴。 ticks.x = element_line(color = c(“black”,“transparent”,“black”,“transparent”,“black”,“black”))' – Jota

+0

是的,这可能是OP思路的顶点,并且至少可读。 “scale”方法的优势在于它可以自动处理所有网格线并自动打勾,缺点是代码没有意义。 – alistaire

+0

非常好,谢谢! “hacky”的方式确实遵循我的原始思路,但是我可以看到使用'facet_grid'的好处。如果我命名方面并希望它们按非字母顺序排列(即“第一”,“第二”,“第四”),我该怎么做?这种修改使它们按字母顺序排列。 'my.data%>%mutate(grp = case_when(。$ x =='a'〜“first”, 。$ x =='b'〜“second”, TRUE〜“forth”))%> % ggplot(aes(x,fill = y))+ geom_bar(position ='fill')+ facet_grid(。〜grp,space ='free_x',scales ='free_x')' – MST