2012-02-29 27 views
15

Tôi đã gặp phải vấn đề thú vị với việc mở rộng quy mô bằng ggplot. Tôi có một tập dữ liệu mà tôi có thể đồ thị tốt bằng cách sử dụng quy mô tuyến tính mặc định nhưng khi tôi sử dụng scale_y_log10() các con số đi theo cách tắt. Dưới đây là một số mã ví dụ và hai hình ảnh. Lưu ý rằng giá trị lớn nhất trong thang đo tuyến tính là ~ 700 trong khi kết quả thu nhỏ nhật ký có giá trị là 10^8. Tôi cho bạn thấy rằng toàn bộ tập dữ liệu chỉ dài ~ 8000 mục nên có gì đó không đúng.ggplot scale_y_log10() issue

Tôi tưởng tượng vấn đề có liên quan đến cấu trúc tập dữ liệu của tôi và việc binning khi tôi không thể sao chép lỗi này trên tập dữ liệu chung như 'kim cương'. Tuy nhiên tôi không chắc chắn cách tốt nhất để khắc phục sự cố.

cảm ơn, zach cp


Edit: bdamarest có thể tạo lại vấn đề quy mô trên các tập dữ liệu kim cương như thế này:

example_1 = ggplot(diamonds, aes(x=clarity, fill=cut)) + 
    geom_bar() + scale_y_log10(); print(example_1) 

#data.melt is the name of my dataset  
> ggplot(data.melt, aes(name, fill= Library)) + geom_bar() 
> ggplot(data.melt, aes(name, fill= Library)) + geom_bar() + scale_y_log10() 
> length(data.melt$name) 
[1] 8003 

linear scale log scale

đây là một số dữ liệu ví dụ ... và tôi nghĩ rằng tôi thấy sự cố. Bộ dữ liệu đã tan chảy ban đầu có thể dài ~ 10^8 hàng. Có lẽ các số hàng đang được sử dụng cho các số liệu thống kê?

> head(data.melt) 
     Library   name    group 
221938  AB Arthrofactin  glycopeptide 
235087  AB Putisolvin  cyclic peptide 
235090  AB Putisolvin  cyclic peptide 
222125  AB Arthrofactin  glycopeptide 
311468  AB  Triostin cyclic depsipeptide 
92249  AB   CDA   lipopeptide 


> dput(head(test2)) 
structure(list(Library = c("AB", "AB", "AB", "AB", "AB", "AB" 
), name = c("Arthrofactin", "Putisolvin", "Putisolvin", "Arthrofactin", 
"Triostin", "CDA"), group = c("glycopeptide", "cyclic peptide", 
"cyclic peptide", "glycopeptide", "cyclic depsipeptide", "lipopeptide" 
)), .Names = c("Library", "name", "group"), row.names = c(221938L, 
235087L, 235090L, 222125L, 311468L, 92249L), class = "data.frame") 

UPDATE:

số Row không vấn đề. Dưới đây là cùng một dữ liệu vẽ đồ thị bằng cách sử dụng cùng một aes trục x và điền màu sắc và rộng là hoàn toàn chính xác:

> ggplot(data.melt, aes(name, fill= name)) + geom_bar() 
> ggplot(data.melt, aes(name, fill= name)) + geom_bar() + scale_y_log10() 
> length(data.melt$name) 
[1] 8003 

enter image description here enter image description here

Trả lời

24

geom_barscale_y_log10 (hoặc bất kỳ quy mô logarit) không làm việc tốt cùng nhau và không đưa ra kết quả mong đợi.

Vấn đề cơ bản đầu tiên là các thanh đến 0 và trên thang loga, 0 được chuyển thành vô cực âm (khó có thể vẽ được). Các nôi xung quanh điều này thường bắt đầu từ 1 chứ không phải là 0 (vì $ \ log (1) = 0 $), không âm mưu bất cứ điều gì nếu có 0 đếm, và không lo lắng về sự biến dạng vì nếu một quy mô đăng nhập là cần thiết bạn có thể don không quan tâm đến việc bị tắt 1 (không nhất thiết phải đúng, nhưng ...)

Tôi đang sử dụng ví dụ diamonds mà @dbemarest đã cho thấy.

Để làm điều này nói chung là chuyển đổi tọa độ, không phải tỷ lệ (nhiều hơn về sự khác biệt sau này).

ggplot(diamonds, aes(x=clarity, fill=cut)) + 
    geom_bar() + 
    coord_trans(ytrans="log10") 

Nhưng điều này mang lại một lỗi

Error in if (length(from) == 1 || abs(from[1] - from[2]) < 1e-06) return(mean(to)) : 
    missing value where TRUE/FALSE needed 

phát sinh từ vấn đề vô cùng tiêu cực.

Khi bạn sử dụng phép biến đổi tỷ lệ, phép biến đổi được áp dụng cho dữ liệu, sau đó thống kê và sắp xếp được thực hiện, sau đó thang đo được gắn nhãn trong phép biến đổi nghịch đảo (khoảng). Bạn có thể thấy những gì đang xảy ra bằng cách tự mình phá vỡ các tính toán.

DF <- ddply(diamonds, .(clarity, cut), summarise, n=length(clarity)) 
DF$log10n <- log10(DF$n) 

mang đến cho

> head(DF) 
    clarity  cut n log10n 
1  I1  Fair 210 2.322219 
2  I1  Good 96 1.982271 
3  I1 Very Good 84 1.924279 
4  I1 Premium 205 2.311754 
5  I1  Ideal 146 2.164353 
6  SI2  Fair 466 2.668386 

Nếu chúng ta vẽ này theo cách thông thường, chúng tôi nhận được âm mưu thanh dự kiến:

ggplot(DF, aes(x=clarity, y=n, fill=cut)) + 
    geom_bar(stat="identity") 

enter image description here

và nhân rộng các trục y cho cùng một vấn đề khi sử dụng dữ liệu chưa được tổng hợp trước.

ggplot(DF, aes(x=clarity, y=n, fill=cut)) + 
    geom_bar(stat="identity") + 
    scale_y_log10() 

enter image description here

Chúng ta có thể xem như thế nào vấn đề xảy ra bằng cách vẽ các log10() giá trị của số lượng.

ggplot(DF, aes(x=clarity, y=log10n, fill=cut)) + 
    geom_bar(stat="identity") 

enter image description here

này trông giống như một với scale_y_log10, nhưng các nhãn là 0, 5, 10, ... thay vì 10^0, 10^5, 10^10,. ..

Vì vậy, việc sử dụng số scale_y_log10 làm cho số lượng, chuyển đổi chúng thành nhật ký, ngăn xếp các nhật ký đó và sau đó hiển thị tỷ lệ trong biểu mẫu chống đăng nhập. Tuy nhiên, các bản ghi xếp chồng không phải là một phép biến đổi tuyến tính, vì vậy những gì bạn đã yêu cầu nó làm không có ý nghĩa gì cả. Điểm mấu chốt là các biểu đồ thanh xếp chồng lên nhau trên thang đo log không có ý nghĩa nhiều bởi vì chúng không thể bắt đầu ở 0 (vị trí đáy thanh), và so sánh các phần của thanh không hợp lý bởi vì kích thước của chúng phụ thuộc vào vị trí của chúng trong ngăn xếp. Coi thay vì một cái gì đó như:

ggplot(diamonds, aes(x=clarity, y=..count.., colour=cut)) + 
    geom_point(stat="bin") + 
    scale_y_log10() 

enter image description here

Hoặc nếu bạn thực sự muốn có một tổng cho các nhóm đó xếp chồng các thanh thường sẽ cung cấp cho bạn, bạn có thể làm điều gì đó như:

ggplot(diamonds, aes(x=clarity, y=..count..)) + 
    geom_point(aes(colour=cut), stat="bin") + 
    geom_point(stat="bin", colour="black") + 
    scale_y_log10() 

enter image description here

+1

cảm ơn Brian, tôi đánh giá cao sự giải thích chi tiết của bạn. Bạn cũng có thể sử dụng geom_bar (position = "dodge") (trả lời lịch sự của Winston Chang) – zach

+0

Để hiểu rõ hơn về những gì đang xảy ra ở đây, các biểu đồ thanh xếp chồng thường cung cấp cho bạn chiều cao thanh bằng tổng số đếm. Tuy nhiên, tổng (log (đếm)) tương đương với log (sản phẩm (đếm)). Nói cách khác, bạn sẽ thấy chiều cao thanh như thể bạn nhân số lượng với nhau. – Brian