Tăng số lượng đánh dấu trục


188

Tôi đang tạo ra các lô cho một số dữ liệu, nhưng số lượng bọ quá ít, tôi cần độ chính xác hơn trong việc đọc.

Có cách nào để tăng số lượng dấu tick trục trong ggplot2 không?

Tôi biết tôi có thể nói với ggplot sử dụng một vectơ làm dấu tick trục, nhưng điều tôi muốn là tăng số lượng bọ, cho tất cả dữ liệu. Nói cách khác, tôi muốn số đánh dấu được tính từ dữ liệu.

Có thể ggplot thực hiện điều này trong nội bộ với một số thuật toán, nhưng tôi không thể tìm thấy nó hoạt động như thế nào, để thay đổi theo những gì tôi muốn.

Câu trả lời:


186

Bạn có thể ghi đè lên các tỷ lệ mặc định của ggplots bằng cách sửa đổi scale_x_continuousvà / hoặc scale_y_continuous. Ví dụ:

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

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

Cung cấp cho bạn điều này:

nhập mô tả hình ảnh ở đây

Và ghi đè lên quy mô có thể cung cấp cho bạn một cái gì đó như thế này:

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))

nhập mô tả hình ảnh ở đây

Nếu bạn chỉ muốn "phóng to" một phần cụ thể của cốt truyện, hãy nhìn xlim()ylim()tương ứng. Cái nhìn sâu sắc cũng có thể được tìm thấy ở đây để hiểu các lý lẽ khác là tốt.


4
Trên thực tế, vấn đề sẽ là "khái quát hóa" byđối số, theo các thang số khác nhau, nghĩa là 0,5 là một giá trị tốt cho dữ liệu này có phạm vi là c (-3,3), nhưng đó không phải là phạm vi tốt cho dữ liệu trong phạm vi là c (0,5000). Có một số chức năng tính toán nó?
João Daniel

3
@ JoãoDaniel - Ý tôi là ggplot thực hiện công việc này một cách tự động. Nếu nó không tạo ra một tập hợp kết quả thỏa đáng, tôi không chắc có chức năng tích hợp để cung cấp một cái gì đó khác biệt. Mức độ chi tiết bạn sẽ muốn cụ thể cho cốt truyện của bạn, nhưng có thể suy nghĩ qua một số trường hợp thử nghiệm và mức độ chi tiết được chỉ định của bạn để xác định một mẫu ... nếu đây là một boxplot, một cái gì đó giống như max-min/30một "cái xô" khá phổ biến kích thước ... nhưng đó có thể là một điểm khởi đầu tốt cho bạn.
Đuổi theo

4
Còn đối với các giá trị phân loại trên trục x như các tháng trong năm cho chuỗi thời gian thì sao?
Scott Davis

3
@ScottDavis có một cái nhìn tại liên kết . Bạn có thể sử dụngscale_x_date(date_breaks = "5 months", date_minor_breaks = "1 months")
Markus Hauschel

Để phóng to coord_cartesiannên được sử dụng thay vì xlim. stackoverflow.com/questions/25685185/ từ
qwr

166

Dựa trên nhận xét của Daniel Krizian , bạn cũng có thể sử dụng pretty_breakschức năng từ scalesthư viện, được nhập tự động:

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))

Tất cả bạn phải làm là chèn số lượng bọ ve muốn n.


Một giải pháp ít hữu ích hơn một chút (vì bạn phải xác định lại biến dữ liệu), bạn có thể sử dụng prettyhàm tích hợp:

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))

16
Đây rõ ràng là câu trả lời tốt nhất! Btw ggplot đã nhập scalesnhưng không thêm các chức năng vào không gian tên của bạn. Do đó, bạn có thể gọi chúng mà không cần nhập như scales::pretty_breaks(n = 10).
trong khi

63

Bạn có thể cung cấp một đối số hàm cho scalevà ggplot sẽ sử dụng hàm đó để tính toán các vị trí đánh dấu.

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))

81
Không cần phải tạo chức năng riêng number_ticks. Điều này đã được thực hiện trong pretty_breaks {scales}. Do đó: 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) cần require(scales)2) điều này dường như ngăn chặn sự phá vỡ của tôi xuất hiện trong ký hiệu khoa học, do đó 1e6 được đổi thành 1000000 ??
smci

6
Bạn có thể sử dụng cơ sở R prettymà không cần scalesgói, chỉ cung cấp các giá trị làm đối số. Ví dụ:(breaks=pretty(dat$x, n=10))
Molx

@smci Nếu ggplot2 hoạt động thì cân có sẵn. ggplot2 sẽ không hoạt động mà không có quy mô.
Claus Wilke

6

Phiên bản sắp tới v3.3.0 ggplot2sẽ có tùy chọn n.breakstự động tạo các ngắt cho scale_x_continuousscale_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)

nhập mô tả hình ảnh ở đây

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

nhập mô tả hình ảnh ở đây


4

Ngoài ra,

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

Hoạt động đối với dữ liệu trục x được chia tỷ lệ hoặc rời rạc (Tức là làm tròn không cần thiết).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.