2017-12-26 8 views
6

다음 예를 고려 범례 데이터를 플롯 다음 a 양동이디스플레이 만

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

데이터 만이 표시되고, 또 양쪽 a, 그리고 b 범례에 나타난다. 이 문제를 어떻게 해결할 수 있습니까? 실제로 범선에 표시된 범프 만 범례에 나타납니다.

zooming into plotsshiny (으)로 시도하는 동안이 문제가 발생합니다.

+0

확대/축소 후 표시된 플롯 영역 밖에있는 점이 있으면 다른 모든 점 클래스를 표시하는 것이 기본 동작입니다. – Heikki

+3

@Heikki 하하, 그건 나에게 바람직하지 않다. 따라서 질문이 – eddi

+1

인 경우,'coord_cartesian'을 사용하여 데이터를 필터링하는 대신'shiny'가 반환 한 것을 사용할 수 있습니다. – bouncyball

답변

5

z의 필터링이 실제 사용 사례를 다루고 있습니까? 예를 들면 다음과 같습니다.

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)) 

또는 사용자가 입력 한 미적 변수로 더 일반화 될 수있는 함수입니다. (I는 또한만큼 지점간에 연결 라인 적어도 하나의 플롯 영역을 통과하더라도 데이터 포인트를 포함하지 플롯 영역의 라인 플롯 보간을 사용하는 기능을 업데이트되었습니다.)

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

고마워요! 주위를 클릭 한 후 - 이것은'my_plot (c (1.1, 1.6))'케이스를 다루지는 않지만, 저에게는 충분한 해결책입니다. – eddi

+1

플롯 영역에 데이터 포인트가없는 경우를 처리하기 위해 보간법을 사용하는 답을 업데이트했습니다. – eipi10