2010-04-21 12 views
11

To jest kontynuacja od this question, in which I was trying to suppress the vertical gridlines.Jak mogę ukryć pionowe linie siatki na wykresie ggplot2, zachowując etykiety osi X?

Rozwiązaniem, dostarczonym przez learnr, było dodanie scale_x_continuous (breaks = NA), ale efekt uboczny polegał również na tłumieniu etykiet osi X. Jestem całkowicie szczęśliwy, mogąc napisać etykiety z powrotem ręcznie, ale nie jest dla mnie jasne, jak ustalić, gdzie powinny trafić etykiety.

Inną opcją jest wytłumienie wszystkich linii siatki (za pomocą opcji opts (panel.grid.major = theme_blank()) lub niektórych takich), a następnie powrót do głównych poziomych linii siatki. Znowu, problemem tutaj jest, jak dowiedzieć się, jakie są przerwy w działce do dostarczenia do geom_hline().

Więc zasadniczo, moi są następujące opcje:.

  1. zwalczaniu pionowe linie siatki i etykiet osi X (z wykorzystaniem scale_x_continuous (przerwy = na)) i dodać etykiety osi x powrotem w
  2. kresu wszelkim gridlines (za pomocą opts (panel.grid.major = theme_blank())) i dodać główne poziome linie siatki z powrotem za pomocą geom_hline().

Oto dwie opcje:

library(ggplot2) 

data <- data.frame(x = 1:10, y = c(3,5,2,5,6,2,7,6,5,4)) 

# suppressing vertical gridlines and x-axis labels 
# need to re-draw x-axis labels 
ggplot(data, aes(x, y)) + 
    geom_bar(stat = 'identity') + 
    scale_x_continuous(breaks = NA) + 
    opts(
    panel.grid.major = theme_line(size = 0.5, colour = '#1391FF'), 
    panel.grid.minor = theme_blank(), 
    panel.background = theme_blank(), 
    axis.ticks = theme_blank() 
) 

# suppressing all gridlines 
# need to re-draw horizontal gridlines, probably with geom_hbar() 
ggplot(data, aes(x, y)) + 
    geom_bar(stat = 'identity') + 
    scale_x_continuous(breaks = NA) + 
    opts(
    panel.grid.major = theme_blank(), 
    panel.grid.minor = theme_blank(), 
    panel.background = theme_blank(), 
    axis.ticks = theme_blank() 
) 
+0

Możesz użyć funkcji geom_text(), aby ręcznie dodać etykiety tyka osi X. – learnr

Odpowiedz

5

jako kod w komentarzach nie wyświetla ładnie, więc jestem delegowania to jako odpowiedź. Można zrobić coś takiego i dodać etykiety ręcznie z geom_text():

ggplot(data, aes(x, y)) + 
     geom_bar(stat = 'identity') + 
     scale_x_continuous(breaks = NA) + 
     opts(
       panel.grid.major = theme_line(size = 0.5, colour = '#1391FF'), 
       panel.grid.minor = theme_blank(), 
       panel.background = theme_blank(), 
       axis.ticks = theme_blank() 
     )+ 
     geom_text(aes(label = x, y = -.3)) 
+0

Och, duh - byłem zdezorientowany, ponieważ, aby przerysować poziome linie siatki, musiałem wiedzieć, gdzie były ślady/znaki podziałki, ale znam już pozycje x dla słupków, więc to nie jest problem. Dzięki za pomoc, LearnR! – Tarek

+2

Kolejna szybka notatka tutaj - ta odpowiedź rozwiązuje moje pytanie w sposób opisany, ale zdecydowanie nie jest to idealne rozwiązanie, ponieważ rysujemy etykiety x w obszarze wykresu, a nie na marginesie.Ma to efekt domina dla zakresu y i przerw, dlatego rozwiązanie, które jest oddzielone od obszaru danych, byłoby lepsze. Hadley, nie wiem, czy to czytasz, ale jakiś sposób wyłączenia poziomych lub pionowych linii siatki byłby niesamowity ... – Tarek

1

Można to zrobić edytując grob bezpośrednio, spróbuj:

grid.remove(gPath("panel.grid.minor.x.polyline"),grep=T) 
grid.remove(gPath("panel.grid.major.x.polyline"),grep=T) 

będzie zdejmować swoje pionowe linie. Mam problemy z używaniem go wewnątrz funkcji, ponieważ domyślam się, że działa tylko wtedy, gdy drukowany jest ggplot.

Ale, jeśli to nie jest twój przypadek i po prostu potrzebujesz grafiki, to zadziała.

2

powyższych odpowiedzi nie będzie działać w wersji 0.9.2.1 ggplot2 i powyżej. Na szczęście jest teraz łatwiejszy sposób na zrobienie tego, co opisano w odpowiedzi na inne pytanie: https://stackoverflow.com/a/8992102/800044.

Powiązane problemy