2012-03-08 41 views
36

में ggplot2 का उपयोग कर मैं नीचे से एक की तरह एक साजिश बनाना चाहते हैं:"रडार चार्ट" (उर्फ तारा साजिश; मकड़ी साजिश) बनाने के आर

enter image description here

मैं जानता हूँ कि मैं fmsb से radarchart समारोह का उपयोग कर सकते पैकेज। मुझे आश्चर्य है कि ggplot2 ध्रुवीय समन्वय का उपयोग कर ऐसा कर सकता है? धन्यवाद।

+6

के बाद से ggplot2 मुझे और भी कर रही पहलू साजिश शीर्षक पर बेहतर नियंत्रण, xy पैमाने लेबल, और देता है, मैं 30 रडार भूखंडों करने की ज़रूरत है और मैं उन्हें 1 पृष्ठ में दिखाना चाहते हैं, और यह मुझे बेहतर मदद समझ कैसे काम करता है ggplot2 – lokheart

+3

आप मूल ग्राफिक्स के साथ ऐसा कर सकते हैं। सममूल्य (mfrow = c (5,6)) और वहाँ एक पृष्ठ पर अपने 30 (छोटे छोटे) भूखंडों है। साजिश शीर्षक के लिए 'शीर्षक ("हैलो")' के साथ क्या गलत है? कभी कभी समय ggplot2 समझने खर्च आधार ग्राफिक्स के साथ इसके साथ पर हो रही है .... – Spacedman

+21

बेहतर खर्च किया जाता है मुझे लगता है कि यह एक वैध सवाल में ggplot2 –

उत्तर

9

सबसे पहले, हम कुछ पैकेज लोड करते हैं।

library(reshape2) 
library(ggplot2) 
library(scales) 

यहां दिए गए रेडकार्ट उदाहरण से डेटा यहां दिया गया है।

maxmin <- data.frame(
    total = c(5, 1), 
    phys = c(15, 3), 
    psycho = c(3, 0), 
    social = c(5, 1), 
    env = c(5, 1) 
) 
dat <- data.frame(
    total = runif(3, 1, 5), 
    phys = rnorm(3, 10, 2), 
    psycho = c(0.5, NA, 3), 
    social = runif(3, 1, 5), 
    env = c(5, 2.5, 4) 
) 

हमें ggplot के लिए उपयुक्त बनाने के लिए थोड़ा हेरफेर चाहिए।

उन्हें सामान्यीकृत करें, एक आईडी कॉलम जोड़ें और लंबे प्रारूप में कनवर्ट करें।

normalised_dat <- as.data.frame(mapply(
    function(x, mm) 
    { 
     (x - mm[2])/(mm[1] - mm[2]) 
    }, 
    dat, 
    maxmin 
)) 

normalised_dat$id <- factor(seq_len(nrow(normalised_dat))) 
long_dat <- melt(normalised_dat, id.vars = "id") 

ggplot भी मान लपेटता तो पहली और आखिरी कारकों उनसे मिलें। इससे बचने के लिए हम एक अतिरिक्त कारक स्तर जोड़ते हैं। यह अब सच नहीं है।

स्तर (long_dat $ चर) < - सी (स्तर (long_dat $ चर), "")

यहाँ साजिश है। यह काफी समान नहीं है, लेकिन आपको इसे शुरू करना चाहिए।

ggplot(long_dat, aes(x = variable, y = value, colour = id, group = id)) + 
    geom_line() + 
    coord_polar(theta = "x", direction = -1) + 
    scale_y_continuous(labels = percent) 

enter image description here नोट है कि जब आप coord_polar उपयोग करते हैं, लाइनों घुमावदार रहे हैं। यदि आप सीधी रेखाएं चाहते हैं, तो आपको एक अलग तकनीक का प्रयास करना होगा।

+0

था कोई लाइनों सीधे बनाने में कामयाब रहे? (रिची को पुनश्च: अच्छा समाधान आप भी क्यों मेरे पहली और आखिरी कारकों अप को पूरा नहीं करते पर टिप्पणी कर सकते हैं, भले ही वहाँ कोई '" "' स्तर क्या है?) –

+0

ऐसा लगता है @Anton 'ggplot2' के व्यवहार है कि परिवर्तन के बाद से मैंने यह जवाब लिखा है। (वहाँ एक बहुत बड़ी पुनर्लेखन v0.9 आसपास कहीं था।) मैं कोड को नवीनीकृत किया है तो यह फिर से काम करता है। मैं लाइनों को सीधा करने या स्टार्ट और एंड पॉइंट मैच करने का एक स्पष्ट तरीका नहीं देख सकता। मैंने सोचा कि 'geom_path' उत्तरार्द्ध करेगा, लेकिन ऐसा लगता है कि यह काम नहीं करता है। –

4

आप एक गैर ध्रुवीय समन्वय संस्करण के लिए देख रहे हैं, मुझे लगता है कि निम्नलिखित समारोह में मदद मिलेगी:

################################### 
##Radar Plot Code 
########################################## 
##Assumes d is in the form: 
# seg meanAcc sdAcc meanAccz sdAccz meanSpd sdSpd cluster 
# 388 -0.038 1.438 -0.571 0.832 -0.825 0.095  1 
##where seg is the individual instance identifier 
##cluster is the cluster membership 
##and the variables from meanACC to sdSpd are used for the clustering 
##and thus should be individual lines on the radar plot 
radarFix = function(d){ 
    ##assuming the passed in data frame 
    ##includes only variables you would like plotted and segment label 
    d$seg=as.factor(d$seg) 
    ##find increment 
    angles = seq(from=0, to=2*pi, by=(2*pi)/(ncol(d)-2)) 
    ##create graph data frame 
    graphData= data.frame(seg="", x=0,y=0) 
    graphData=graphData[-1,] 



    for(i in levels(d$seg)){ 
    segData= subset(d, seg==i) 
    for(j in c(2:(ncol(d)-1))){ 
     ##set minimum value such that it occurs at 0. (center the data at -3 sd) 
     segData[,j]= segData[,j]+3 

     graphData=rbind(graphData, data.frame(seg=i, 
              x=segData[,j]*cos(angles[j-1]), 
              y=segData[,j]*sin(angles[j-1]))) 
    } 
    ##completes the connection 
    graphData=rbind(graphData, data.frame(seg=i, 
              x=segData[,2]*cos(angles[1]), 
              y=segData[,2]*sin(angles[1]))) 

    } 
    graphData 

} 

आप क्लस्टर या समूह द्वारा योजना बना रहे हैं, तो आप उसके बाद निम्न का उपयोग कर सकते हैं:

radarData = ddply(clustData, .(cluster), radarFix) 
ggplot(radarData, aes(x=x, y=y, group=seg))+ 
    geom_path(alpha=0.5,colour="black")+ 
    geom_point(alpha=0.2, colour="blue")+ 
    facet_wrap(~cluster) 

यह निम्न डेटा नमूने के साथ काम करना चाहिए:

seg meanAccVs sdAccVs meanSpd sdSpd cluster 
    1470  1.420 0.433 -0.801 0.083  1 
    1967 -0.593 0.292 1.047 0.000  3 
    2167 -0.329 0.221 0.068 0.053  7 
    2292 -0.356 0.214 -0.588 0.056  4 
    2744  0.653 1.041 -1.039 0.108  5 
    3448  2.189 1.552 -0.339 0.057  8 
    7434  0.300 0.250 -1.009 0.088  5 
    7764  0.607 0.469 -0.035 0.078  2 
    7942  0.124 1.017 -0.940 0.138  5 
    9388  0.742 1.289 -0.477 0.301  5 

Radar plot

2

यहां एक उत्तर है जो लगभग ggplot में करता है।

मुझे क्या करना है और न ही उदाहरण यहाँ डालने से ज्यादा कुछ भी दावा करते हैं, वह आधारित है क्या पर हेडली यहां https://github.com/hadley/ggplot2/issues/516

से पता चला सभी मैं था उपयोग deployer/tidyr बजाय किया था और

सादगी

के लिए केवल 3 कारों चुनें अभी भी लंबित मुद्दे 1) अंतिम और पहला बिंदु कनेक्ट नहीं है, यह स्पष्ट है यदि आप पारंपरिक x धुरी के लपेटने के रूप में coord_polar देखते हैं। ऐसा कोई कारण नहीं है कि उन्हें क्यों जोड़ा जाना चाहिए। लेकिन इस तरह रडार चार्ट सामान्य रूप से 2 दिखाए जाते हैं) ऐसा करने के लिए आपको उन 2 बिंदुओं के बीच मैन्युअल रूप से सेगमेंट जोड़ने की आवश्यकता है।थोड़ा हेरफेर और कुछ और परतों को यह करना चाहिए। मैं अगर मैं कुछ समय के

library(dplyr);library(tidyr);library(ggplot2) 
#make some data 
data = mtcars[c(27,19,16),] 
data$model=row.names(data) 

#connvert data to long format and also rescale it into 0-1 scales 
data1 <- data %>% gather(measure,value,-model) %>% group_by(measure) %>% mutate(value1=(value-min(value))/(max(value)-min(value))) 

is.linear.polar <- function(coord) TRUE 
ggplot(data1,aes(x=measure,y=value1,color=model,group=model))+geom_line()+coord_polar() 
2

मैं इस समस्या पर कई दिन बिताए और अंत में मैं ggradar के ऊपर बनाया गया my own package करने का फैसला किया है उस पर काम करने की कोशिश करेंगे। - ggradar से दूसरों को कार्यों में

CalculateGroupPath4 <- function(df) { 
    angles = seq(from=0, to=2*pi, by=(2*pi)/(ncol(df)-1)) # find increment 
    xx<-c(rbind(t(plot.data.offset[,-1])*sin(angles[-ncol(df)]), 
       t(plot.data.offset[,2])*sin(angles[1]))) 
    yy<-c(rbind(t(plot.data.offset[,-1])*cos(angles[-ncol(df)]), 
       t(plot.data.offset[,2])*cos(angles[1]))) 
    graphData<-data.frame(group=rep(df[,1],each=ncol(df)),x=(xx),y=(yy)) 
    return(graphData) 
} 
CalculateGroupPath5 <- function(mydf) { 
    df<-cbind(mydf[,-1],mydf[,2]) 
    myvec<-c(t(df)) 
    angles = seq(from=0, to=2*pi, by=(2*pi)/(ncol(df)-1)) # find increment 
    xx<-myvec*sin(rep(c(angles[-ncol(df)],angles[1]),nrow(df))) 
    yy<-myvec*cos(rep(c(angles[-ncol(df)],angles[1]),nrow(df))) 
    graphData<-data.frame(group=rep(mydf[,1],each=ncol(mydf)),x=(xx),y=(yy)) 
    return(graphData) 
} 

microbenchmark::microbenchmark(CalculateGroupPath(plot.data.offset), 
           CalculateGroupPath4(plot.data.offset), 
           CalculateGroupPath5(plot.data.offset), times=1000L) 
Unit: microseconds 
expr  min   lq  mean  median   uq  max neval 
CalculateGroupPath(plot.data.offset) 20768.163 21636.8715 23125.1762 22394.1955 23946.5875 86926.97 1000 
CalculateGroupPath4(plot.data.offset) 550.148 614.7620 707.2645 650.2490 687.5815 15756.53 1000 
CalculateGroupPath5(plot.data.offset) 577.634 650.0435 738.7701 684.0945 726.9660 11228.58 1000 

ध्यान दें कि मैं वास्तव में more functions in this benchmark तुलना में है इसके बारे में कोर @Tony एम के समारोह के एक उन्नत संस्करण है। आम तौर पर @ टोनी एम का समाधान अच्छी तरह से लिखा जाता है - तर्क के अर्थ में और आप इसे कई अन्य भाषाओं में उपयोग कर सकते हैं, जैसे उदा। जावास्क्रिप्ट, कुछ tweaks के साथ। हालांकि R बहुत तेज़ हो जाता है यदि आप संचालन को सदिश करते हैं। इसलिए मेरे समाधान के साथ गणना समय में भारी लाभ।

@Tony एम के को छोड़कर सभी जवाब ggplot2 से coord_polar समारोह का इस्तेमाल किया है। कार्टेसियन समन्वय प्रणाली के भीतर रहने के चार फायदे हैं:

  1. यह आपको अपने समाधान को अन्य साजिश पैकेजों में भी परिवहन करने की अनुमति देता है, उदाहरण के लिए plotly
  2. प्रत्येक व्यक्ति जो मानक कोसिनस और साइनस-फ़ंक्शन की कुछ समझ लेता है, वह समझ सकता है कि डेटा रूपांतरण कैसे काम करता है।
  3. आप प्लॉट को विस्तार और अनुकूलित कर सकते हैं जैसे आप चाहते हैं - नरक, आप आर में उपलब्ध किसी भी प्लॉटिंग पैकेज के साथ इसका उपयोग कर सकते हैं!
  4. आपको अपने प्लॉटिंग-पैकेज को छोड़कर किसी भी को लोड करने की आवश्यकता नहीं है। हालांकि यह आपके डेटा को पुन: सहेजने के लिए अधिकतर समझ में आता है उदा। हैडली के scales -पैकेज के साथ।

One possible implementation

मेरी तरह आप कैसे रडार भूखंडों जब आप इस सूत्र लगता है क्या करने के लिए कुछ भी नहीं के बारे में जानते हैं: coord_polar() अच्छी लग रही रडार भूखंडों बना सकता है। हालांकि कार्यान्वयन कुछ हद तक मुश्किल है।

  1. इस दृष्टिकोण के साथ पहला मुद्दा है कि लाइनों सीधे नहीं रहते: जब मैं इसे करने की कोशिश मैं कई मुद्दों था।
  2. coord_polar() उदा। साजिश में अनुवाद नहीं है।
  3. ध्रुवीय समन्वय प्रणाली विस्तृत अनुकूलन को मुश्किल बनाती है, क्योंकि एनोटेशन और अन्य सुविधाएं ध्रुवीय निर्देशांक में भी फेंक दी जाएंगी।

यहाँ यह आदमी coord_polar का उपयोग कर एक nice radar-chart बनाया है।

हालांकि मेरे अनुभव दिए गए - मैं coord_polar() -ट्रिक का उपयोग करने के बजाय सलाह देता हूं। इसके बजाय यदि आप स्थैतिक ggplot-radar बनाने के लिए 'आसान तरीका' ढूंढ रहे हैं, तो शायद रडार की मंडलियों को आकर्षित करने के लिए महान ggforce -package का उपयोग करें। कोई गारंटी नहीं है कि यह मेरे पैकेज का उपयोग करने से आसान है, लेकिन अनुकूलन से coord_polar की तुलना में साफ दिखता है। यहां नुकसान यह है कि उदा। plotly ggforce-extention का समर्थन नहीं करता है।

संपादित करें: अब मुझे ggplot2 के coord_polar के साथ अच्छा उदाहरण मिला जिसने मेरी राय को थोड़ा सा संशोधित किया।

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