स्वचालित रूप से अलग-अलग रंगीन रेखाओं को प्लॉट करें


112

मैं एक ही ग्राफ पर कई कर्नेल घनत्व अनुमान लगाने की कोशिश कर रहा हूं, और मैं चाहता हूं कि वे सभी अलग-अलग रंग के हों। मेरे पास एक स्ट्रिंग का उपयोग करके एक घोल है 'rgbcmyk'और प्रत्येक अलग भूखंड के लिए इसके माध्यम से कदम है, लेकिन मुझे 7 पुनरावृत्तियों के बाद डुप्लिकेट होने लगते हैं। क्या ऐसा करने का एक आसान / अधिक कुशल तरीका है, और अधिक रंग विकल्पों के साथ?

for n=1:10
 source(n).data=normrnd(rand()*100,abs(rand()*50),100,1); %generate random data
end
cstring='rgbcmyk'; % color string
figure
hold on
for n=1:length(source)
 [f,x]=ksdensity(source(n).data); % calculate the distribution
 plot(x,f,cstring(mod(n,7)+1))  % plot with a different color each time
end

30
क्या आपने बस "सभी को पकड़" करने की कोशिश की? यह स्वचालित रूप से प्रत्येक नए प्लॉट कमांड के लिए समाचार रंग बनाता है।
twerdster

3
"होल्ड ऑल" वास्तविक प्रश्न का उत्तर नहीं है, लेकिन यहां समाप्त होने वाले कई लोगों के लिए एक समाधान हो सकता है क्योंकि एक "पकड़" केवल नीले रंग के सभी घटता को खींचता है। @Twerdster को बहुत-बहुत धन्यवाद!
रेमी

8
R2014b के रूप में , सामान्य रूप hold onसे कार्यात्मक रूप से बराबर है hold all। हालांकि, 7 से अधिक डिफ़ॉल्ट रंगों को कैसे प्राप्त किया जाए इसका सवाल बना हुआ है। एक डिफ़ॉल्ट रंग मानचित्र एक समाधान हो सकता है जैसा कि अजीम द्वारा वर्णित है या आसान दृश्य भेदभाव के लिए तैयार किए गए रंगों को उत्पन्न करने के लिए एक फ़ंक्शन का उपयोग किया जा सकता है, नीचे के रूप में
चाप्पज

1
जब मैं उपयोग करता hold allहूं तो मुझे विभिन्न रंगों में भूखंड मिलते हैं (भले ही मुझे कहना चाहिए कि वे बहुत सुस्त दिखते हैं), जबकि जब मैं उपयोग hold onकरता हूं, तो मेरे सभी भूखंड नीले हो जाते हैं। इसलिए मुझे आश्चर्य है कि कार्यात्मक तुल्यता क्या है।
हैलोगूडीबाई

4
@ HelloGoodbye R2014b और नए में, hold onअलग-अलग रंग के प्लॉट देता है। आप उपयोग कर रहे हैं और पुराने संस्करण। से वर्तमान डॉक्स , " hold allके रूप में ही है hold on: नोट का प्रयोग करें इस वाक्य रचना एक भविष्य के रिलीज में हटा दिया जाएगा। hold onबजाय।" जारी नोट भी देखें ।
चाप्पज

जवाबों:


131

आप रंगों का एक सेट उत्पन्न करने के लिए एचएसवी जैसे एक कोलरमैप का उपयोग कर सकते हैं। उदाहरण के लिए:

cc=hsv(12);
figure; 
hold on;
for i=1:12
    plot([0 1],[0 i],'color',cc(i,:));
end

MATLAB में 13 अलग-अलग कॉलोर्मैप्स हैं ( 'डॉक्टर कॉलॉर्मैप' उन सभी को सूचीबद्ध करता है)।

विभिन्न रंगों में लाइनों की साजिश रचने के लिए एक और विकल्प लाइनसिटी ऑडर संपत्ति का उपयोग करना है; देख प्लॉटिंग के लिए लाइनों के रंग को परिभाषित करना और जानकारी के लिए MATLAB दस्तावेज में।


ढूंढ रहा था। अच्छी तरह से @Azim रहो।
प्रोफेसर

पोस्टरिटी की खातिर, मैंने @Mark इलियट के hold allसमाधान पर इस उत्तर को स्वीकार करने का विकल्प चुना क्योंकि इसकी बहुमुखी प्रतिभा के कारण विभिन्न रंगों के नक्शे चुनने में सक्षम थे।
डोरसॉम्

प्लॉट के बजाय "लाइन" प्लॉट कमांड का उपयोग करके मैं इसे कैसे बना सकता हूं?
पेड्रो77

106

वास्तव में, रंगों को चक्र में लाने के लिए एक सभ्य शॉर्टकट विधि के hold all;स्थान पर उपयोग करना है hold on;। प्रत्येक क्रम plotMATLAB के डिफ़ॉल्ट कॉलोर्मैप के माध्यम से (स्वचालित रूप से आपके लिए) घूमेगा।

MATLAB साइट से hold:

hold allप्लॉट और करंट लाइन कलर और लाइन स्टाइल को होल्ड करता है ताकि बाद में प्लॉटिंग कमांड लिस्ट की शुरुआत में ColorOrder और LineStyleOrder प्रॉपर्टी वैल्यू को रीसेट न करें। प्लॉटिंग कमांड पूर्वनिर्धारित रंगों और लिनस्टाइल के माध्यम से साइकिल चलाना जारी रखते हैं जहां से सूची में अंतिम प्लॉट बंद हो गया है।


36

देर से जवाब, लेकिन दो चीजें जोड़ने के लिए:

  • 'ColorOrder'संपत्ति कैसे बदलें और इसके साथ वैश्विक डिफ़ॉल्ट कैसे सेट करें 'DefaultAxesColorOrder', इसकी जानकारी के लिए, इस पोस्ट के नीचे "परिशिष्ट" देखें।
  • MATLAB सेंट्रल फाइल एक्सचेंज पर एक बहुत अच्छा टूल है जो किसी भी प्रकार के नेत्रहीन रंगों को उत्पन्न करने के लिए है, यदि आपके पास इसका उपयोग करने के लिए इमेज प्रोसेसिंग टूलबॉक्स है। जानकारी के लिए आगे पढ़ें।

ColorOrder axesसंपत्ति का उपयोग करते समय रंग की एक सूची के माध्यम से स्वचालित रूप से चक्र करने के लिए अनुमति देता है MATLAB hold on/all(फिर से, नीचे परिशिष्ट देखते हैं कि कैसे करने के लिए set/getColorOrder एक विशिष्ट अक्ष के लिए या विश्व स्तर पर के माध्यम से DefaultAxesColorOrder)। हालाँकि, डिफ़ॉल्ट MATLAB केवल रंगों की एक छोटी सूची ( R2013b के रूप में सिर्फ 7 ) को निर्दिष्ट करता है , और दूसरी ओर अधिक डेटा श्रृंखला के लिए रंगों का एक अच्छा सेट खोजने के लिए समस्याग्रस्त हो सकता है। 10 भूखंडों के लिए, आप स्पष्ट रूप से डिफ़ॉल्ट पर भरोसा नहीं कर सकते ColorOrder

करने के लिए एक शानदार तरीका एन चाक्षुष रूप से भिन्न रंगों को परिभाषित के साथ है "उत्पन्न ज़्यादा से ज़्यादा Perceptually-अलग रंग" (GMPDC) MATLAB केंद्रीय फ़ाइल फ़ाइल एक्सचेंज में जमा । यह लेखक के अपने शब्दों में सबसे अच्छा वर्णित है:

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

उदाहरण के लिए, जब 25 रंगों का अनुरोध किया जाता है:

25 "अधिकतम अवधारणात्मक-अलग रंग"

GMPDC सबमिशन को पिक ऑफ द वीक के रूप में मैथवर्क्स के आधिकारिक ब्लॉग पर चुना गया था में 2010 में चुना गया था क्योंकि रंगों की एक मनमानी संख्या का अनुरोध करने की क्षमता के कारण (MATLAB के 7 डिफ़ॉल्ट रंगों के विपरीत)। उन्होंने MATLAB ColorOrderको स्टार्टअप पर सेट करने का उत्कृष्ट सुझाव भी दिया ,

distinguishable_colors(20)

बेशक, आप ColorOrderकिसी एक अक्ष के लिए सेट कर सकते हैं या बस किसी भी तरह से उपयोग करने के लिए रंगों की एक सूची तैयार कर सकते हैं। उदाहरण के लिए, 10 "अधिकतम अवधारणात्मक-विशिष्ट रंग" उत्पन्न करने के लिए और एक ही अक्ष पर 10 भूखंडों के लिए उनका उपयोग करें ( लेकिन उपयोग नहीं करते हैं ColorOrder, इस प्रकार लूप की आवश्यकता होती है ):

% Starting with X of size N-by-P-by-2, where P is number of plots
mpdc10 = distinguishable_colors(10) % 10x3 color list
hold on
for ii=1:size(X,2),
    plot(X(:,ii,1),X(:,ii,2),'.','Color',mpdc10(ii,:));
end

प्रक्रिया को सरलीकृत किया गया है, और कोई आवश्यकता नहीं हैforColorOrderअक्ष गुण के साथ, लूप की गया है :

% X आकार N-by-P-by-2
mpdc10 = विशिष्ट_रक्षक (10)
हा = कुल्हाड़ियों; पकड़ (हा, 'चालू')
सेट (हा, 'ColorOrder', mpdc10)% --- सेट ColorOrder यहाँ ---
प्लॉट (X (:,:, 1), X (:,:, 2), '-')% लूप की जरूरत नहीं, 'कलर' की जरूरत नहीं। वाह!

अनुबंध

प्राप्त करने के लिए ColorOrderवर्तमान अक्ष के लिए इस्तेमाल किया आरजीबी सरणी,

get(gca,'ColorOrder')

ColorOrderनए अक्षों के लिए डिफ़ॉल्ट पाने के लिए,

get(0,'DefaultAxesColorOrder')

ColorOrderMATLAB की शुरुआत में 10 रंगों के साथ नए वैश्विक सेट करने का उदाहरण startup.m:

set(0,'DefaultAxesColorOrder',distinguishable_colors(10))

2
बस एक नोट, इसके लिए इमेज प्रोसेसिंग टूलबॉक्स की आवश्यकता होती है।
दोजूम

2
@ डोरसम जानकारी के लिए धन्यवाद। मैंने पोस्ट अपडेट कर दी है।
चाप्पज

12

पार्टी के लिए देर से। मैं खुद इस पर गौर कर रहा था और सिर्फ ColorOrder नामक इस अक्ष विकल्प के बारे में पाया गया, आप सत्र के लिए या केवल आकृति के लिए रंग क्रम निर्दिष्ट कर सकते हैं और फिर केवल एक सरणी की साजिश कर सकते हैं और MATLAB को स्वचालित रूप से निर्दिष्ट रंगों के माध्यम से चक्र कर सकते हैं।

डिफ़ॉल्ट ColorOrder को बदलना देखें

उदाहरण

set(0,'DefaultAxesColorOrder',jet(5))
A=rand(10,5);
plot(A);

1
एक बार की धुरी के लिए:set(gca,'ColorOrder',jet(5));
इवगेनी सर्गेव सिप

1
केवल जेट (संख्या) के बारे में सूचित करने के लिए उत्कृष्ट, जिसे किसी भी फैंसी टूलबॉक्स की आवश्यकता नहीं है
क्रोबार

4

यदि सभी वैक्टर के आकार समान हैं, तो एक मैट्रिक्स बनाएं और उसे प्लॉट करें। प्रत्येक कॉलम को स्वचालित रूप से एक अलग रंग के साथ प्लॉट किया जाता है फिर आप legendकॉलम को इंगित करने के लिए उपयोग कर सकते हैं:

data = randn(100, 5);

figure;
plot(data);

legend(cellstr(num2str((1:size(data,2))')))

या, यदि आपके पास गुठली के नाम के साथ एक सेल है, तो उपयोग करें

legend(names)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.