2016-02-26 13 views
5

Tôi phải vẽ dữ liệu với các giá trị phạm vi rất khác nhau. Tôi đang sử dụng thiết kế khía cạnh của ggplot2 với tùy chọn facet_grid(variable ~ ., scales = "free"). Tuy nhiên, tôi muốn đặt giá trị của các dấu ngắt trên trục y sao cho tất cả các biến ngắt là c(0, max(variable)/2, max(variable)). Tôi đã thử sử dụng scale_y_continuous, nhưng nó không hoạt động.Làm thế nào để xác định các trục y phá vỡ trong một cốt truyện facetted bằng cách sử dụng ggplot2?

tái sản xuất ví dụ:

v1 <- sample(rnorm(100, 10, 1), 30) 
v2 <- sample(rnorm(100, 20, 2), 30) 
v3 <- sample(rnorm(100, 50, 5), 30) 
fac1 <- factor(rep(rep(c("f1", "f2", "f3"), each = 10), 3)) 

library(reshape2) 
library(ggplot2) 
df1 <- melt(data.frame(fac1, v1, v2, v3)) 
ggplot(df1, aes(fac1, value, group = variable)) + 
    geom_point() + 
    facet_grid(variable ~ ., scales = "free") + 
    theme_bw() 
+0

Vấn đề ggplot [Chỉ xlim và ylim cho mỗi khía cạnh riêng rẽ] (https://github.com/hadley/ggplot2/issues/187) cho thấy rằng nó không phải là có thể. Xem thêm nhận xét của @ hadley từ ngày 24 tháng 2 năm 2014: "_Đây có vẻ như một tính năng tuyệt vời, nhưng tiếc là chúng tôi hiện không có băng thông phát triển để hỗ trợ nó_". – Henrik

+0

Bài viết SO liên quan: [Làm thế nào để bạn đặt giới hạn thang đo khác nhau cho các khía cạnh khác nhau?] (Http://stackoverflow.com/questions/4276218/how-do-you-set-different-scale-limits-for-different-facets) và [Liệu có thể có các giới hạn/giới hạn trục khác nhau cho các khía cạnh riêng lẻ trong ggplot với tỷ lệ tự do không?] (http://stackoverflow.com/questions/18819333/is-it-yet-possible-to-have-different -axis-break-limits-for-individual-facets) – Henrik

+0

Cảm ơn bạn. Tôi sẽ cố gắng tìm một giải pháp khác, có thể với grid.arrange? – user34771

Trả lời

1

này dựa ba lô riêng biệt, với sự phá vỡ y đặt thành 0, 0,5 * max (giá trị), và tối đa (giá trị). Ba ô được kết hợp sử dụng hàm rbind gtable, sau đó được vẽ.

v1 <- sample(rnorm(100, 10, 1), 30) 
v2 <- sample(rnorm(100, 20, 2), 30) 
v3 <- sample(rnorm(100, 50, 5), 30) 
fac1 <- factor(rep(rep(c("f1", "f2", "f3"), each = 10), 3)) 

library(reshape2) 
library(ggplot2) 
library(grid) 
library(gridExtra) 

df1 <- melt(data.frame(fac1, v1, v2, v3)) 

# Draw the three charts, each with a facet strip. 
# But drop off the bottom margin material 
dfp1 = subset(df1, variable == "v1") 
p1 = ggplot(dfp1, aes(fac1, value, group = variable)) + 
    geom_point() + 
    facet_grid(variable ~ .) + 
    scale_y_continuous(limits = c(0, ceiling(max(dfp1$value))), 
     breaks = c(0, ceiling(max(dfp1$value))/2, ceiling(max(dfp1$value)))) + 
    theme_bw() 
g1 = ggplotGrob(p1) 
pos = g1$layout[grepl("xlab-b|axis-b", g1$layout$name), "t"] 
g1 = g1[-pos, ] 

# Drop off the bottom margin material 
dfp2 = subset(df1, variable == "v2") 
p2 = ggplot(dfp2, aes(fac1, value, group = variable)) + 
    geom_point() + 
    facet_grid(variable ~ .) + 
    scale_y_continuous(limits = c(0, ceiling(max(dfp2$value))), 
    breaks = c(0, ceiling(max(dfp2$value))/2, ceiling(max(dfp2$value)))) + 
    theme_bw() 
g2 = ggplotGrob(p2) 
g2 = g2[-pos,] 

dfp3 = subset(df1, variable == "v3") 
p3 = ggplot(dfp3, aes(fac1, value, group = variable)) + 
    geom_point() + 
    facet_grid(variable ~ .) + 
    scale_y_continuous(limits = c(0, ceiling(max(dfp3$value))), 
    breaks = c(0, ceiling(max(dfp3$value))/2, ceiling(max(dfp3$value)))) + 
    theme_bw() 
g3 = ggplotGrob(p3) 

# Combine the three gtables 
g = rbind.gtable(g1, g2, size = "max") 
g = rbind.gtable(g, g3, size = "max") 

# Draw the plot 
grid.newpage() 
grid.draw(g) 

enter image description here

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