2012-02-28 39 views
14

Tôi đang âm mưu một cực biểu đồ đồ thị/bánh lớn 40+ quầy bar/nhẫn với ggplot2 (sử dụng geom_barcoord_polar (theta = "y")), và tôi thấy rằng việc nén âm trục y khiến cho các vòng trong cùng có độ phân giải đa giác rất kém.Tăng độ phân giải đa giác của lô cực ggplot

Bất kỳ ai biết cách để tăng độ phân giải đa giác?

df <- data.frame(
    x = sort(sample(1:40, 400, replace=TRUE)), 
    y = sample(0:9, 400, replace=TRUE) 
) 


ggplot(df, aes(x=x, y=y, fill=y)) + 
    geom_bar(stat='identity', position="fill") + 
    coord_polar(theta="y") + 
    scale_fill_continuous(low="blue", high="pink") 

enter image description here

Đây là những gì tôi có nghĩa là do độ phân giải hình học Tôi đang cố gắng để đạt được. Tôi quản lý điều này bằng cách vẽ chỉ 5 cấp độ.

enter image description here

Khi tôi tăng lên 40 cấp độ đa giác trung ương mất êm ái của mình và trở nên quá lởm chởm, như thế này:

enter image description here

+1

Tôi sẽ upvote bạn nếu bạn nhập mã của bạn và một số dữ liệu ví dụ. – James

+0

Và tôi thậm chí có thể downvote nếu bạn không đăng mã tái sản xuất và dữ liệu mẫu. Xem http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example để biết các mẹo về đặt câu hỏi hay. – Andrie

+0

Chúc mừng! Mã này tái tạo vấn đề. Nếu bạn lưu vào PDF và phóng to vào trung tâm, bạn sẽ thấy những gì tôi có ý nghĩa. 'df <- dữ liệu.khung (x = sắp xếp (mẫu (1:40, 400, thay thế = TRUE)), ' \t' y = mẫu (0: 9, 400, thay thế = TRUE)) ' ' ggplot (df, aes (x = x, y = y, điền = y)) + ' \t' geom_bar (stat = 'identity', position = "fill") + ' \t' coord_polar (theta = "y") + ' \t' scale_fill_continuous (low = "blue", high = "pink") ' – geotheory

Trả lời

8

Vấn đề là với ggplot2:::coord_munch chức năng, trong đó có một cuộc tranh cãi segment_length với giá trị mặc định là 0,01:

https://github.com/hadley/ggplot2/blob/master/R/coord-munch.r

Tôi không nghĩ rằng có bất cứ nơi nào để vượt qua trong các đối số mà sẽ làm cho nó xuống đối số segment_length của . Một cách để xử lý nó ngay bây giờ là thay thế coord_munch bằng chức năng trình bao bọc có giá trị mặc định khác cho segment_length.

# Save the original version of coord_munch 
coord_munch_old <- ggplot2:::coord_munch 

# Make a wrapper function that has a different default for segment_length 
coord_munch_new <- function(coord, data, range, segment_length = 1/500) { 
    coord_munch_old(coord, data, range, segment_length) 
} 
# Make the new function run in the same environment 
environment(coord_munch_new) <- environment(ggplot2:::coord_munch) 

# Replace ggplot2:::coord_munch with coord_munch_new 
assignInNamespace("coord_munch", coord_munch_new, ns="ggplot2") 

Khi đã xong, bạn có thể chạy ví dụ một lần nữa:

set.seed(123) 
df <- data.frame(
    x = sort(sample(1:40, 400, replace=TRUE)), 
    y = sample(0:9, 400, replace=TRUE) 
) 

pdf('polar.pdf') 
ggplot(df, aes(x=x, y=y, fill=y)) + 
    geom_bar(stat='identity', position="fill") + 
    coord_polar(theta="y") + 
    scale_fill_continuous(low="blue", high="pink") 
dev.off() 

Gán giá trị trong một namespace chỉ là nghĩa vụ phải được sử dụng cho mục đích phát triển, vì vậy đây không phải là một giải pháp dài hạn tốt .

+1

Tôi tin rằng điều này chỉ hoạt động với phiên bản 0.9.0 trở lên; phiên bản 0.8.9 không có 'coord_munch' –

+0

Để có cách giải quyết khác, hãy xem nhận xét của tôi ở trên. – geotheory

0

Ngoài chẩn đoán chính xác WCH và cách giải quyết trên, một workaround thay thế được đề xuất bởi Jean-Olivier qua ggplot2 Google Nhóm:

Thay vào đó, việc thay đổi dữ liệu để tăng giá trị tọa độ trong không gian dữ liệu , bằng cách thực hiện một việc như sau:

ggplot(df, aes(x=x+100, y=y, fill=y)) + 
geom_bar(stat='identity', position="fill") + 
coord_polar(theta="y") + 
scale_fill_continuous(low="blue", high="pink") 

Cảm ơn mọi người.

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