2012-11-09 13 views
17

मैं बिखराव प्लॉट करने के लिए कोशिश कर रहा हूँ datapoints की उच्च संख्या के साथ बिखराव भूखंडों, की तरह कुछ:matlab:

scatter(coor(:, 2), coor(:, 3), 1, coor(:, 4)); 

समस्या यह है, कि मैं निर्देशांक की काफी बड़ी संख्या प्लॉट करने के लिए है (~ 100 000)। इसे साजिश करने में काफी समय लग रहा है, और जब मैं टिफ को आंकड़े निर्यात करने की कोशिश करता हूं - तो मैटलैब कुछ मिनटों के लिए मर जाता है ... साजिश में सुधार करने के लिए कोई समाधान, या कम से कम टिफ निर्यात?

संपादित करें: उल्लेख करने के लिए भूल गए, तीसरा समन्वय (कोर (:, 4)) एक रंग कोड है।

तो, जब मैं स्कैटर (ऊपर के रूप में) का उपयोग कर रहा हूं, तो मेरे पास नीचे दी गई छवि पर कुछ है, और यह बिल्कुल ठीक है कि मैं इसे कैसे देखना चाहता हूं (बस इसकी सुपर धीमी और मैं इसे निर्यात नहीं कर सकता):

scatter

जब मैं कार्य करें:

plot3 (coor (:, 2), coor (:, 3), coor (:, 4), '।')

प्रभाव उतना ही अच्छा नहीं है ny अधिक (ध्यान दें: चित्र हैं नहीं एक ही निर्देशांक ... से): अंक

enter image description here

+0

क्या कोई यह जानता है कि डेटा को पिक्सेल में कताई करके इसे कैसे हल किया जाए, फिर इसे एक छवि के रूप में प्रदर्शित करें? – Anael

उत्तर

23

आप plot का उपयोग कर सकते हैं, लेकिन फिर सभी बिंदुओं का एक ही रंग होता है। हालांकि, अगर आप विभिन्न सबसेट में सेट विभाजित और उन्हें एक अपने स्वयं के रंग के साथ साजिश कर सकते हैं:

N = 100000; 
x = rand(N,1); 
y = rand(N,1); 
C = sin(2*x)+y; 

cdivs = 10; 
[~, edges] = hist(C,cdivs-1); 
edges = [-Inf edges Inf]; % to include all points 
[Nk, bink] = histc(C,edges); 

figure; 
hold on; 
cmap = jet(cdivs); 
for ii=1:cdivs 
    idx = bink==ii; 
    plot(x(idx),y(idx),'.','MarkerSize',4,'Color',cmap(ii,:)); 
end 

colormap(cmap) 
caxis([min(C) max(C)]) 
colorbar 

enter image description here

जो पहले से ही एक बहुत scatter(x,y,1,C) जो, एक ही भूखंड के बारे में देता है की तुलना में बेहतर प्रतिक्रिया करता है लेकिन उच्च रंग के साथ संकल्प (जो उपरोक्त मेरे कोड में समायोज्य है)।

+0

+1 बदलने के लिए प्लॉट 3 का उपयोग कैसे करें। मैं अक्सर उस दृष्टिकोण का उपयोग करता हूं इसलिए मैंने इसे और अधिक आसानी से करने के लिए एक सरल विधि भी लिखी (हालांकि डेटा जो मैंने अक्सर अलग-अलग समूहों के मुकाबले आसान अलगाव की अनुमति दी है)। –

+0

बहुत स्मार्ट समाधान। धन्यवाद! – Art

0

हाँ, उपयोग plot3

plot3(coor(:, 2), coor(:, 3), coor(:, 4), '.') 

यह एक 3 डी बिखराव साजिश के रूप में ही करना होगा (छोटे बिंदु होंगे, यदि आप चाहें तो 'o' or 'x' का भी उपयोग कर सकते हैं)

+0

ब्याज के लिए धन्यवाद, हालांकि यह मेरी समस्या को हल नहीं कर रहा है, कृपया उपरोक्त EDIT देखें ... – Art

+0

हाँ दुर्भाग्य से मुझे नहीं पता कि रंग –

0

यदि आपके पास बहुत अधिक अंक हैं तो यह डेटा को पतला करने के लिए समझ में आता है।

मूल रूप से आप दो दृष्टिकोण कर सकता है:

  1. सरल - बस चयन करें - अंक का 10% बेतरतीब ढंग से कहते हैं।

  2. अंक छोड़ दें जो जाहिर तौर पर आपकी सीमा के बाहर दिखाई नहीं देंगे, लेकिन यदि आपके पास बहुत सारे ओवरलैप हैं - तो एक बिंदु कहें व्यास में 3px होना चाहिए - इसलिए एक बिंदु 9 पीएक्स कवर होगा। मेरी मशीन पर आपके द्वारा पोस्ट की गई एक साजिश होगी - 400x400px कहें तो ceil(400*400/9) < 20 000 डेटा पॉइंट्स पर डेटा पॉइंट दिखाई देंगे। की तरह भूखंड 1000 अंक, इस मुद्दे को एक drawnow तो अगले 1000 तक आप कर रहे हैं -


आप भी छोटे टुकड़ों में भूखंड अलग करने की कोशिश कर सकता है।तो आपको एक खाली स्क्रीन के सामने इंतजार नहीं करना है।

1

मेरा अनुभव यह है कि मैटलैब में सबसे कुशल प्लॉटिंग कमांड पैच है, और मैंने इसका उपयोग स्कैटर या स्कैटर 3 की कार्यक्षमता को बहुत अधिक दक्षता के साथ अनुकरण करने के लिए किया है।

यदि आपके पास अंक की एक सूची है, तो अपने विशेष डेटा के लिए उचित किनारे की लंबाई के स्क्वायर पैच (या ऑक्टोगोन, या जो भी) को परिभाषित करने के लिए प्रत्येक बिंदु का उपयोग करें, फिर पैच को एक कॉल के साथ पैच का संग्रह प्लॉट करें। ग्राफ़िक ऑब्जेक्ट बनने के बाद, आप अलग-अलग रंगों को रंगने के लिए अपना रंग डेटा अपडेट कर सकते हैं।

आप अपने डेटा सेट से क्यूब्स या 3 डी क्रॉस बनाकर 3 डी में एक ही अवधारणा का उपयोग कर सकते हैं।

यह स्निपेट इस मामले में यादृच्छिक रंगों के साथ 1e5 यादृच्छिक रूप से रखे वर्ग बनाता है और मेरे चार साल के लैपटॉप पर एक सेकंड के नीचे चलाता है। स्कैटर के लिए एक समान कॉल 40 सेकंड लेता है, और एक अनावश्यक आंकड़ा देता है जो कुशलतापूर्वक उपयोग करना मुश्किल होता है।

tic 
P=rand(1e5,2); 
Edge=.01; 
X=[P(:,1)'; P(:,1)'+Edge; P(:,1)'+Edge; P(:,1)']; 
Y=[P(:,2)'; P(:,2)'; P(:,2)'+Edge; P(:,2)'+Edge]; 
figure; 
h=patch(X,Y,'r'); 
set(h,'facevertexcdata',rand(size(X,2),3),'facecolor','flat','edgecolor','none') 
drawnow 
toc