2012-07-04 33 views
117

Tôi đang tạo lô cho một số dữ liệu, nhưng số lượng ve quá nhỏ, tôi cần thêm chính xác khi đọc.Tăng số lượng dấu trục

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

Tôi biết tôi có thể yêu cầu ggplot sử dụng vector làm dấu trục, nhưng điều tôi muốn là tăng số lượng ve, cho tất cả dữ liệu. Nói cách khác, tôi muốn số lượng đánh dấu được tính từ dữ liệu.

Có thể ggplot làm đ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ó như thế nào, để thay đổi theo những gì tôi muốn.

Trả lời

123

Bạn có thể ghi đè lên cân bằng mặc định của ggplots bằng cách sửa đổi scale_x_continuous và/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:

enter image description here

Và trọng 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)) 

enter image description here

Nếu bạn muốn chỉ đơn giản là "phóng to" ở trên một phần cụ thể của một cốt truyện, nhìn vào xlim()ylim() tương ứng. Thông tin chi tiết tốt cũng có thể được tìm thấy here để hiểu các đối số khác.

+2

Trên thực tế, điểm sẽ là "tổng quát" đối số 'by', với các thang số khác nhau, nghĩa là 0,5 là giá trị tốt cho dữ liệu này là c (-3,3), nhưng không tốt phạm vi cho một dữ liệu có phạm vi là c (0,5000). Có một số chức năng tính toán nó? –

+1

@ JoãoDaniel - Tôi có nghĩa là ggplot làm một công việc tốt ở đây tự động. Nếu nó không tạo ra một tập hợp các kết quả thỏa đáng, tôi không chắc có một hàm dựng sẵn để cung cấp một cái gì đó khác biệt. Mức độ chi tiết bạn sẽ muốn sẽ được cụ thể cho cốt truyện của bạn, nhưng có thể suy nghĩ thông 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ẫu ... nếu đây là một ô, giống như 'max-min/30' là một kích thước "xô" khá phổ biến ...nhưng điều đó có thể hoặc có thể không phải là điểm khởi đầu tốt cho bạn. – Chase

+2

Điều gì về 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? –

53

Bạn có thể cung cấp đối số hàm cho scale và ggplot sẽ sử dụng chức năng đó để tính 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)) 
+72

Không cần 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 (ngắt = pretty_breaks (n = 10)) + scale_y_continuous (ngắt = pretty_breaks (n = 10)) ' –

+10

@ Daniel Krizian: 1) cần 'yêu cầu (quy mô)' 2) điều này dường như để ngăn chặn phá vỡ của tôi xuất hiện trong ký hiệu khoa học, do đó 1e6 được thay đổi đến 1000000 ?? – smci

+5

Bạn có thể sử dụng 'pretty' của base R mà không có gói' scales', chỉ cung cấp các giá trị làm đối số. Ví dụ: '(breaks = pretty (dat $ x, n = 10))' – Molx

76

Bạn có thể sử dụng được xây dựng trong pretty chức năng:

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

Dựa trên Daniel Krizian's comment, bạn cũng có thể sử dụng pretty_breaks chức năng từ scales thư viện, mà được nhập khẩu 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ả những gì bạn phải làm là chèn số lượng bọ ve mong muốn.

+6

Đây rõ ràng là câu trả lời hay nhất! Btg ggplot đã nhập 'scale' nhưng không thêm các hàm 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 khẩu là 'scales :: pretty_breaks (n = 10)'. – while

1

Bên cạnh đó,

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

trình cho dữ liệu quy mô trục x binned hoặc rời rạc (Tức là, làm tròn không cần thiết).

Các vấn đề liên quan