พล็อตเส้นสีต่างๆโดยอัตโนมัติ


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!
Rémi

8
R2014bปกติhold onจะเทียบเท่ากับhold all. อย่างไรก็ตามคำถามเกี่ยวกับวิธีรับมากกว่า 7 สีเริ่มต้นยังคงอยู่ แผนที่สีเริ่มต้นอาจจะแก้ปัญหาตามที่อธิบายไว้โดย Azim หรือฟังก์ชั่นเพื่อสร้างสีสันความคืบหน้าสำหรับการเลือกปฏิบัติที่มองเห็นได้ง่ายสามารถนำมาใช้ดังต่อไปนี้
chappjc

1
เมื่อฉันใช้hold allฉันได้พล็อตด้วยสีที่แตกต่างกัน (แม้ว่าฉันต้องบอกว่ามันดูทึมๆ) ในขณะที่ฉันใช้พhold onล็อตทั้งหมดของฉันจะกลายเป็นสีน้ำเงิน ผมเลยสงสัยว่าการเทียบเท่าฟังก์ชันคืออะไร
HelloGoodbye

4
@HelloGoodbye ใน R2014b และใหม่กว่าhold onให้พล็อตสีที่แตกต่างกัน คุณกำลังใช้และเวอร์ชันเก่ากว่า จากเอกสารปัจจุบัน " hold allเป็นเช่นเดียวกับhold on. หมายเหตุ: . ไวยากรณ์นี้จะถูกลบออกในรุ่นอนาคตใช้hold onแทน." ดูเพิ่มเติมบันทึกประจำรุ่น
chappjc

คำตอบ:


131

คุณสามารถใช้ colormap เช่น HSV เพื่อสร้างชุดสี ตัวอย่างเช่น:

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

MATLAB มี 13 colormaps ที่มีชื่อแตกต่างกัน ( 'doc colormap'แสดงรายการทั้งหมด)

อีกทางเลือกหนึ่งสำหรับการพล็อตเส้นด้วยสีที่ต่างกันคือการใช้คุณสมบัติLineStyleOrder ดูการกำหนดสีของเส้นสำหรับการลงจุดในเอกสาร MATLAB สำหรับข้อมูลเพิ่มเติม


กำลังมองหามัน สบายดี @Azim
ศาสตราจารย์

เพื่อประโยชน์ของคนรุ่นหลังฉันเลือกที่จะยอมรับคำตอบนี้เกี่ยวกับhold allโซลูชันของ @Mark Elliot เนื่องจากความสามารถในการเลือกแผนที่สีต่างๆได้อย่างหลากหลาย
Doresoom

ฉันจะทำให้มันทำงานโดยใช้คำสั่ง "line" plot แทน plot ได้อย่างไร
Pedro77

106

ที่จริงแล้ววิธีการทางลัดที่ดีสำหรับการรับสีที่จะวงจรคือการใช้ในสถานที่ของhold all; hold on;แต่ละรายการต่อเนื่องplotจะหมุน (โดยอัตโนมัติสำหรับคุณ) ผ่าน colormap เริ่มต้นของ MATLAB

จากไซต์ MATLAB บนhold:

hold allเก็บพล็อตและสีของเส้นปัจจุบันและลักษณะของเส้นเพื่อให้คำสั่งการลงจุดที่ตามมาไม่รีเซ็ตค่าคุณสมบัติ ColorOrder และ LineStyleOrder เป็นจุดเริ่มต้นของรายการ คำสั่งการพล็อตยังคงวนไปตามสีที่กำหนดไว้ล่วงหน้าและเส้นสายจากจุดที่พล็อตสุดท้ายหยุดลงในรายการ


36

คำตอบช้า แต่มีสองสิ่งที่ต้องเพิ่ม:

  • สำหรับข้อมูลเกี่ยวกับวิธีการเปลี่ยน'ColorOrder'คุณสมบัติและวิธีตั้งค่าเริ่มต้นส่วนกลาง'DefaultAxesColorOrder'โปรดดู "ภาคผนวก" ที่ด้านล่างของโพสต์นี้
  • มีเครื่องมือที่ยอดเยี่ยมใน MATLAB Central File Exchange ในการสร้างสีที่แตกต่างกันออกไปจำนวนเท่าใดก็ได้หากคุณมีกล่องเครื่องมือประมวลผลภาพที่จะใช้ อ่านรายละเอียดเพิ่มเติม

ColorOrder axesคุณสมบัติช่วยให้ MATLAB เพื่อวงจรโดยอัตโนมัติผ่านรายการของสีเมื่อใช้hold on/all(อีกครั้งดูที่ภาคผนวกด้านล่างสำหรับวิธีการset/ สำหรับแกนที่เฉพาะเจาะจงหรือทั่วโลกผ่านทาง) อย่างไรก็ตามโดยค่าเริ่มต้นMATLAB จะระบุเฉพาะรายการสีสั้น ๆ ( เพียงแค่ 7 สีณ R2013b)เพื่อหมุนเวียนและในทางกลับกันอาจเป็นปัญหาในการค้นหาชุดสีที่ดีสำหรับชุดข้อมูลเพิ่มเติม สำหรับ 10 แปลงคุณไม่สามารถพึ่งพาค่าเริ่มต้นได้อย่างชัดเจนgetColorOrderDefaultAxesColorOrderColorOrder

วิธีที่ดีที่กำหนดไม่มีสีที่แตกต่างกันทางสายตาเป็นกับ"สร้าง Maximally สี perceptually-ที่แตกต่าง" (GMPDC) ส่งใน MATLAB เซ็นทรัลไฟล์แลกเปลี่ยน อธิบายได้ดีที่สุดด้วยคำพูดของผู้เขียนเอง:

ฟังก์ชันนี้จะสร้างชุดสีที่แยกแยะได้โดยการอ้างอิงพื้นที่สี "Lab"ซึ่งตรงกับการรับรู้สีของมนุษย์มากกว่า RGB เมื่อพิจารณาจากรายการสีที่เป็นไปได้จำนวนมากเริ่มต้นระบบจะเลือกรายการในรายการที่อยู่ไกลที่สุด (ในพื้นที่ห้องปฏิบัติการ) จากรายการที่เลือกไว้ก่อนหน้านี้ทั้งหมด

ตัวอย่างเช่นเมื่อมีการร้องขอ 25 สี:

25 "สีที่แตกต่างจากการรับรู้สูงสุด"

การส่ง GMPDC ได้รับเลือกในบล็อกอย่างเป็นทางการของ MathWorks ในฐานะPick of the Weekในปี 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

กระบวนการนี้ง่ายขึ้นโดยไม่ต้องforวนซ้ำด้วยColorOrderคุณสมบัติของแกน :

% X ของขนาด N-by-P-by-2
mpdc10 = สีที่แตกต่างได้ (10)
ha = แกน; ถือ (ฮ่า 'ที่')
set (ha, 'ColorOrder', mpdc10)% - ตั้งค่า ColorOrder ที่นี่ -
พล็อต (X (:,:, 1), X (:,:, 2), '-.')% ห่วงไม่จำเป็นไม่จำเป็นต้องใช้ 'สี' เย้!

ภาคผนวก

ในการรับColorOrderอาร์เรย์ RGB ที่ใช้สำหรับแกนปัจจุบัน

get(gca,'ColorOrder')

ในการรับค่าเริ่มต้นColorOrderสำหรับแกนใหม่

get(0,'DefaultAxesColorOrder')

ตัวอย่างการตั้งค่า global ใหม่ColorOrderด้วย 10 สีใน MATLAB start ในstartup.m:

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

2
ดูเหมือนว่าสิ่งนี้จะต้องใช้กล่องเครื่องมือประมวลผลภาพ
Doresoom

2
@Doresoom ขอบคุณสำหรับข้อมูล ฉันได้อัปเดตโพสต์แล้ว
chappjc

12

สายไปงานปาร์ตี้ ฉันกำลังตรวจสอบสิ่งนี้ด้วยตัวเองและเพิ่งพบเกี่ยวกับตัวเลือกแกนที่เรียกว่า ColorOrder คุณสามารถระบุลำดับสีสำหรับเซสชันหรือเฉพาะสำหรับรูปจากนั้นเพียงแค่ลงจุดอาร์เรย์แล้วปล่อยให้ MATLAB วนรอบสีที่ระบุโดยอัตโนมัติ

โปรดดูการเปลี่ยน Default ColorOrder

ตัวอย่าง

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

1
สำหรับแกนset(gca,'ColorOrder',jet(5));
Evgeni Sergeev

1
ยอดเยี่ยมสำหรับการแจ้งข้อมูลเกี่ยวกับเจ็ท (หมายเลข) ซึ่งไม่ต้องใช้กล่องเครื่องมือแฟนซีใด ๆ
crobar

4

หากเวกเตอร์ทั้งหมดมีขนาดเท่ากันให้สร้างเมทริกซ์และลงจุด แต่ละคอลัมน์จะถูกพล็อตด้วยสีที่แตกต่างกันโดยอัตโนมัติจากนั้นคุณสามารถใช้legendเพื่อระบุคอลัมน์:

data = randn(100, 5);

figure;
plot(data);

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

หรือถ้าคุณมีเซลล์ที่มีชื่อเมล็ดให้ใช้

legend(names)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.