2017-12-26 95 views
6

Hãy xem xét ví dụ sau:chỉ hiển thị âm mưu dữ liệu trong truyền thuyết

library(ggplot2) 
df = data.frame(x = 1:5, y = 1:5, z = c('a', 'a', 'a', 'b', 'b')) 

ggplot(df, aes(x, y, col = z)) + geom_line() + geom_point() + 
    coord_cartesian(xlim = c(1, 2.5)) 

enter image description here

Chỉ dữ liệu từ xô a được hiển thị, nhưng cả hai a, và b xuất hiện trong truyền thuyết. Làm thế nào tôi có thể sửa lỗi này, do đó chỉ có thùng thực sự được vẽ trong phần chú giải?

Đối với ngữ cảnh - Tôi gặp phải điều này khi đang thử zooming into plots trong shiny.

+0

Nếu bạn có các điểm bên ngoài khu vực vẽ đồ thị có thể nhìn thấy, đó là trường hợp sau khi phóng to, sau đó hiển thị tất cả các lớp điểm khác nhau là hành vi mặc định. – Heikki

+3

@Heikki haha, ok, nó không được tôi mong muốn - do đó câu hỏi – eddi

+1

bạn có thể sử dụng những gì được trả về bởi 'shiny' để lọc dữ liệu thay vì chỉ định nó bằng cách sử dụng' coord_cartesian' – bouncyball

Trả lời

5

Bộ lọc trên z có bao gồm trường hợp sử dụng thực tế của bạn không? Ví dụ:

library(tidyverse) 

df = data.frame(x = 1:5, y = 1:5, z = c('a', 'a', 'a', 'b', 'b')) 

ggplot(df %>% filter(z %in% z[between(x,1,2.5)]), 
     aes(x, y, col = z)) + 
    geom_line() + geom_point() + 
    coord_cartesian(xlim = c(1, 2.5)) 

Hoặc trong một hàm có thể được khái quát hóa thêm cho các biến thẩm mỹ do người dùng nhập. (Tôi cũng đã cập nhật chức năng sử dụng phép nội suy để vẽ đường ngay cả trong khu vực cốt truyện không chứa điểm dữ liệu, vì vậy miễn là ít nhất một kết nối ranh giới giữa điểm đi qua khu vực cốt truyện.)

my_plot = function(xrng, data=df, step=0.01) { 

    levs = unique(data[["z"]]) 
    n = length(levs) 

    # Generate interpolated data frame so we can plot lines even if 
    # no points appear in the graph region 
    dat_interp = split(data, data$z) %>% 
    map_df(function(d) { 
     x = seq(min(d$x), max(d$x), step) 
     data.frame(z=rep(unique(d$z), each=length(x)), 
       x, y=rep(approx(d$x, d$y, xout=x)$y, n)) 
    }) 

    ggplot(dat_interp %>% filter(z %in% z[between(x,xrng[1],xrng[2])]), 
     aes(x, y, col = z)) + 
    geom_point(data=data %>% filter(z %in% z[between(x,xrng[1],xrng[2])])) + 
    geom_line() + 
    coord_cartesian(xlim = xrng) + 
    scale_color_manual(values=setNames(hcl(seq(15,375,length=n+1)[1:n],100,65), levs)) 
} 


gridExtra::grid.arrange(
    my_plot(c(1,2.5)), 
    my_plot(c(1,4)), 
    my_plot(c(3,4)), 
    my_plot(c(4.3,6)), 
    my_plot(c(1.1,1.6)), 
    my_plot(c(4.2,4.9))) 

enter image description here

+0

Cảm ơn! Sau khi một số nhấp chuột xung quanh - điều này không bao gồm trường hợp 'my_plot (c (1.1, 1.6))', nhưng đó là một giải pháp đủ tốt cho tôi. – eddi

+1

Tôi đã cập nhật câu trả lời để sử dụng phép nội suy để đối phó với trường hợp không có điểm dữ liệu nào trong vùng ô. – eipi10

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