2016-09-16 239 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