Zwiększ liczbę tyknięć osi

191

Generuję wykresy dla niektórych danych, ale liczba tyknięć jest zbyt mała, potrzebuję więcej precyzji odczytu.

Czy jest jakiś sposób na zwiększenie liczby znaczników osi w ggplot2?

Wiem, że mogę powiedzieć ggplot, aby używał wektora jako znaczników osi, ale chcę zwiększyć liczbę znaczników dla wszystkich danych. Innymi słowy, chcę, aby liczba taktów była obliczana na podstawie danych.

Być może ggplot robi to wewnętrznie za pomocą jakiegoś algorytmu, ale nie mogłem znaleźć, jak to robi, aby zmienić zgodnie z tym, czego chcę.

João Daniel
źródło

Odpowiedzi:

188

Możesz zastąpić domyślne skale ggplots, modyfikując scale_x_continuousi / lub scale_y_continuous. Na przykład:

library(ggplot2)
dat <- data.frame(x = rnorm(100), y = rnorm(100))

ggplot(dat, aes(x,y)) +
  geom_point()

Daje ci to:

wprowadź opis zdjęcia tutaj

A przesłonięcie skali może dać ci coś takiego:

ggplot(dat, aes(x,y)) +
  geom_point() +
  scale_x_continuous(breaks = round(seq(min(dat$x), max(dat$x), by = 0.5),1)) +
  scale_y_continuous(breaks = round(seq(min(dat$y), max(dat$y), by = 0.5),1))

wprowadź opis zdjęcia tutaj

Jeśli chcesz po prostu „powiększyć” określoną część wykresu, spójrz odpowiednio na xlim()i ylim(). Dobry wgląd można również znaleźć tutaj, aby zrozumieć również inne argumenty.

Pościg
źródło
4
Właściwie chodzi o „uogólnienie” byargumentu na różne skale liczb, tj. 0,5 jest dobrą wartością dla tych danych, których zakres wynosi c (-3,3), ale nie jest to dobry zakres dla danych, których zakres wynosi c (0,5000). Czy jest jakaś funkcja, która to oblicza?
João Daniel
3
@ JoãoDaniel - Mam na myśli, że ggplot wykonuje przyzwoitą robotę automatycznie. Jeśli nie daje zadowalającego zestawu wyników, nie jestem pewien, czy istnieje wbudowana funkcja zapewniająca coś innego. Poziom szczegółowości, jaki chcesz, będzie specyficzny dla twojej fabuły, ale może zastanów się nad niektórymi przypadkami testowymi i określonym poziomem szczegółowości, aby zidentyfikować wzór ... jeśli byłby to wykres pudełkowy, coś w rodzaju max-min/30jest dość powszechnym „wiadrem” rozmiar ... ale może to być dobry punkt wyjścia.
Chase
4
A co z wartościami kategorialnymi na osi X, takimi jak miesiące roku dla szeregów czasowych?
Scott Davis
3
@ScottDavis zobacz link . Możesz użyćscale_x_date(date_breaks = "5 months", date_minor_breaks = "1 months")
Markus Hauschel
Do powiększania coord_cartesiannależy użyć zamiast xlim. stackoverflow.com/questions/25685185/…
qwr
167

Na podstawie komentarza Daniela Kriziana możesz także użyć pretty_breaksfunkcji z scalesbiblioteki, która jest importowana automatycznie:

ggplot(dat, aes(x,y)) + geom_point() +
scale_x_continuous(breaks = scales::pretty_breaks(n = 10)) +
scale_y_continuous(breaks = scales::pretty_breaks(n = 10))

Wszystko, co musisz zrobić, to wstawić żądaną liczbę kleszczy n.


Nieco mniej przydatne rozwiązanie (ponieważ musisz ponownie określić zmienną danych), możesz użyć wbudowanej prettyfunkcji:

ggplot(dat, aes(x,y)) + geom_point() +
scale_x_continuous(breaks = pretty(dat$x, n = 10)) +
scale_y_continuous(breaks = pretty(dat$y, n = 10))
slhck
źródło
16
To zdecydowanie najlepsza odpowiedź! Btw ggplot już importuje, scalesale nie dodaje funkcji do przestrzeni nazw. Możesz więc zadzwonić do nich bez importu jako scales::pretty_breaks(n = 10).
zaś
63

Możesz podać argument funkcji scale, a ggplot użyje tej funkcji do obliczenia lokalizacji zaznaczenia.

library(ggplot2)
dat <- data.frame(x = rnorm(100), y = rnorm(100))
number_ticks <- function(n) {function(limits) pretty(limits, n)}

ggplot(dat, aes(x,y)) +
  geom_point() +
  scale_x_continuous(breaks=number_ticks(10)) +
  scale_y_continuous(breaks=number_ticks(10))
gromadzenie się
źródło
81
Nie ma potrzeby tworzenia własnej funkcji number_ticks. Zostało to już zaimplementowane w pretty_breaks {scales}. Stąd: ggplot(dat, aes(x,y)) + geom_point() + scale_x_continuous(breaks=pretty_breaks(n=10)) + scale_y_continuous(breaks=pretty_breaks(n=10))
Daniel Krizian
11
@Daniel Krizian: 1) potrzebuje require(scales)2) wydaje się, że zapobiega to pojawianiu się moich przerw w notacji naukowej, stąd 1e6 zmienia się na 1000000 ??
smci
6
Możesz użyć podstawowych R prettybez scalespakietu, po prostu podaj wartości jako argument. Na przykład:(breaks=pretty(dat$x, n=10))
Molx
@smci Jeśli ggplot2 działa, waga jest dostępna. ggplot2 nie będzie działać bez skal.
Claus Wilke,
7

Nadchodząca wersja v3.3.0 z ggplot2 będzie dostępna opcja n.breaksautomatycznego generowania przerw dla scale_x_continuousiscale_y_continuous

    devtools::install_github("tidyverse/ggplot2")

    library(ggplot2)

    plt <- ggplot(mtcars, aes(x = mpg, y = disp)) +
      geom_point()

    plt + 
      scale_x_continuous(n.breaks = 5)

wprowadź opis zdjęcia tutaj

    plt + 
      scale_x_continuous(n.breaks = 10) +
      scale_y_continuous(n.breaks = 10)

wprowadź opis zdjęcia tutaj

Tung
źródło
4

Do tego,

ggplot(dat, aes(x,y)) +
geom_point() +
scale_x_continuous(breaks = seq(min(dat$x), max(dat$x), by = 0.05))

Działa dla binowanych lub dyskretnych skalowanych danych osi X (tj. Zaokrąglanie nie jest konieczne).

bmc
źródło