2017-12-26 114 views
6

निम्नलिखित उदाहरण पर विचार में डेटा साजिश रची:प्रदर्शन केवल कथा

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 बाल्टी से डेटा दोनों a प्रदर्शित किया जाता है, फिर भी, और b कथा में दिखाई देते हैं। मैं इसे कैसे ठीक कर सकता हूं, ताकि केवल बाल्टी जो वास्तव में प्लॉट की गई हो, किंवदंती में दिखाई दे?

संदर्भ के लिए - zooming into plotsshiny में कोशिश करते समय मुझे इसका सामना करना पड़ रहा है।

+0

यदि आपके पास दृश्यमान साजिश क्षेत्र के बाहर बिंदु हैं, जो ज़ूम करने के बाद मामला है, तो सभी अलग-अलग बिंदु वर्ग दिखाएं डिफ़ॉल्ट व्यवहार है। के बीच (एक्स, इस प्रकार प्रश्न – Heikki

+3

@Heikki haha, ठीक है, यह मेरे द्वारा वांछित नहीं है 1,2))%>% ggplot (एईएस (एक्स, वाई, कोल = जेड)) + geom_point() ' – eddi

+1

आप '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)) 

या ऐसे फ़ंक्शन में जिसे उपयोगकर्ता द्वारा दर्ज किए गए सौंदर्य चर के लिए सामान्यीकृत किया जा सकता है। (मैं भी साजिश क्षेत्रों है कि कोई डेटा बिंदुओं को शामिल में भी लाइनों साजिश प्रक्षेप उपयोग करने के लिए समारोह को नवीनीकृत किया है, जब तक कि कम से कम एक अंक के बीच की रेखा को जोड़ने की साजिश क्षेत्र से होकर गुजरता है।)

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

संबंधित मुद्दे