Làm cách nào để thay đổi định dạng số trên một trục bằng ggplot?


131

Tôi đang sử dụng R và ggplot để vẽ một biểu đồ phân tán một số dữ liệu, tất cả đều ổn ngoại trừ các số trên trục y xuất hiện với định dạng số mũ kiểu máy tính, ví dụ 4e + 05, 5e + 05, v.v. không thể chấp nhận được, vì vậy tôi muốn lấy nó để hiển thị chúng là 500.000, 400.000, v.v. Có được một ký hiệu số mũ thích hợp cũng sẽ được chấp nhận.

Mã cho cốt truyện như sau:

p <- ggplot(valids, aes(x=Test, y=Values)) +
  geom_point(position="jitter") +
  facet_grid(. ~ Facet) +
  scale_y_continuous(name="Fluorescent intensity/arbitrary units") +
  scale_x_discrete(name="Test repeat") +
  stat_summary(fun.ymin=median, fun.ymax=median, fun.y=median, geom="crossbar")

Bất kỳ trợ giúp nhiều đánh giá cao.


30
Hãy cẩn thận khi mô tả ggplotcác tùy chọn mặc định là "rõ ràng không thể chấp nhận". Bạn có nghĩa là bạn có một sở thích cá nhân cho một định dạng khác. Một số trong định dạng 4e+05là ký hiệu khoa học và sẽ là định dạng ưa thích trong nhiều ứng dụng.
Andrie

53
4e + 05 không phải là ký hiệu khoa học, nó là một xấp xỉ máy tính với ký hiệu khoa học. Nó sẽ không được chấp nhận trong bất kỳ tạp chí in nào tôi có thể nghĩ ra, vì vậy tôi cho rằng nó không được chấp nhận cho luận án của tôi.
Jack Aidley

Câu trả lời:


126

Một tùy chọn khác là định dạng nhãn đánh dấu trục của bạn bằng dấu phẩy là bằng cách sử dụng gói scalesvà thêm

 scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = comma)

để tuyên bố ggplot của bạn.

Nếu bạn không muốn tải gói, sử dụng:

scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = scales::comma)

9
Thật ngạc nhiên khi một vấn đề tầm thường như vậy đòi hỏi phải tải một gói mới.
luchonacho

FYI, điều này cũng hoạt động với scale_y_log10 (nhãn = scale :: comma) và tôi giả sử các thang đo khác trong ggplot2. Lời khuyên tuyệt vời!
TheProletariat

66

Tôi cũng tìm thấy một cách khác để làm điều này mang lại ký hiệu 'x10 (siêu ký tự) 5' thích hợp trên các trục. Tôi đang đăng nó ở đây với hy vọng nó có thể hữu ích cho một số người. Tôi đã nhận được mã từ đây vì vậy tôi khẳng định không có tín dụng cho nó, điều đó đúng với Brian Diggs.

fancy_scientific <- function(l) {
     # turn in to character string in scientific notation
     l <- format(l, scientific = TRUE)
     # quote the part before the exponent to keep all the digits
     l <- gsub("^(.*)e", "'\\1'e", l)
     # turn the 'e+' into plotmath format
     l <- gsub("e", "%*%10^", l)
     # return this as an expression
     parse(text=l)
}

Mà sau đó bạn có thể sử dụng như

ggplot(data=df, aes(x=x, y=y)) +
   geom_point() +
   scale_y_continuous(labels=fancy_scientific) 

10
Nếu bạn không muốn in 0 thành "0 x 10⁺⁰", hãy thêm dòng dưới đây vào format(...)dòng:l <- gsub("0e\\+00","0",l)
bán ngoài

1
Nếu bạn muốn trường hợp đặc biệt khác, dễ dàng nhất để thêm gsub()trực tiếp sau format(), trong khi kiểm tra những gì format()trả về cho trường hợp của bạn trong một bảng điều khiển riêng.
bán ngoài

3
thêm phần này trước gsublệnh cuối cùng : # remove + after exponent, if exists. E.g.: (3x10^+2 -> 3x10^2) l <- gsub("e\\+","e",l)và sau nó: # convert 1x10^ or 1.000x10^ -> 10^ l <- gsub("\\'1[\\.0]*\\'\\%\\*\\%", "", l)để làm cho nó ở định dạng thường được sử dụng trong các bài báo.
John_West

44
x <- rnorm(10) * 100000
y <- seq(0, 1, length = 10)
p <- qplot(x, y)
library(scales)
p + scale_x_continuous(labels = comma)

Khi tôi thử điều này, tôi nhận được một lỗi mà trình định dạng là một đối số không được sử dụng? Nó cần một gói khác hay cái gì đó?
Jack Aidley

4
Tôi đã thay đổi mã để bao gồm library(scales)và sử dụng commađể hoạt động tốt hơn chức năng mà tôi có trước đây.
Disc rờiCircle

16

Tôi đến trễ trò chơi ở đây nhưng trong trường hợp những người khác muốn có một giải pháp dễ dàng, tôi đã tạo ra một tập hợp các hàm có thể được gọi là:

 ggplot + scale_x_continuous(labels = human_gbp)

cung cấp cho bạn số người có thể đọc được cho trục x hoặc y (hoặc bất kỳ số nào nói chung thực sự).

Bạn có thể tìm thấy các chức năng ở đây: Github Repo Chỉ cần sao chép các chức năng vào tập lệnh của bạn để bạn có thể gọi chúng.


10

Tôi thấy câu trả lời gợi ý của Jack Aidley là một câu trả lời hữu ích.

Tôi muốn ném ra một lựa chọn khác. Giả sử bạn có một chuỗi có nhiều số nhỏ và bạn muốn đảm bảo các nhãn trục ghi ra dấu thập phân đầy đủ (ví dụ 5e-05 -> 0,0005), sau đó:

NotFancy <- function(l) {
 l <- format(l, scientific = FALSE)
 parse(text=l)
}

ggplot(data = data.frame(x = 1:100, 
                         y = seq(from=0.00005,to = 0.0000000000001,length.out=100) + runif(n=100,-0.0000005,0.0000005)), 
       aes(x=x, y=y)) +
     geom_point() +
     scale_y_continuous(labels=NotFancy) 

23
Điều này có thể được rút ngắn bằng cách sử dụng một hàm ẩn danh: scale_y_continuous(labels=function(n){format(n, scientific = FALSE)})Tại sao không có định dạng được xác định trước như thế, địa ngục biết.
eMPee584
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.