Plot garis berwarna berbeda secara otomatis

112

Saya mencoba memplot beberapa estimasi kepadatan kernel pada grafik yang sama, dan saya ingin semuanya memiliki warna yang berbeda. Saya memiliki solusi kludged menggunakan string 'rgbcmyk'dan melewatinya untuk setiap plot terpisah, tetapi saya mulai memiliki duplikat setelah 7 iterasi. Adakah cara yang lebih mudah / efisien untuk melakukan ini, dan dengan lebih banyak pilihan warna?

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
Doresoom
sumber
30
Apakah Anda hanya mencoba melakukan "tahan semua"? Itu secara otomatis menggambar warna berita untuk setiap perintah plot baru.
twerdster
3
"Pegang semua" bukanlah jawaban untuk pertanyaan yang sebenarnya, tetapi mungkin menjadi solusi bagi banyak orang yang berakhir di sini karena "tahan" saja akan menggambar semua kurva dengan warna biru. Terima kasih banyak untuk @twerdster!
Rémi
8
Pada R2014b , yang biasa hold onsecara fungsional setara dengan hold all. Namun, pertanyaan tentang bagaimana mendapatkan lebih dari 7 warna default tetap ada. Peta warna default dapat menjadi solusi seperti yang dijelaskan oleh Azim atau fungsi untuk menghasilkan warna yang disetel untuk memudahkan diskriminasi visual dapat digunakan, seperti di bawah ini .
chappjc
1
Saat saya menggunakan, hold allsaya mendapatkan plot dengan warna berbeda (meskipun harus saya katakan terlihat cukup kusam), sedangkan saat saya menggunakan hold on, semua plot saya menjadi biru. Jadi saya bertanya-tanya apa persamaan fungsional itu.
HelloGoodbye
4
@HelloGoodbye Dalam R2014b dan yang lebih baru, hold onmemberikan plot warna yang berbeda. Anda menggunakan dan versi yang lebih lama. Dari dokumen saat ini , " hold allsama dengan hold on. Catatan: Sintaks ini akan dihapus di rilis mendatang. Gunakan hold onsebagai gantinya." Lihat juga catatan rilis .
chappjc

Jawaban:

131

Anda bisa menggunakan peta warna seperti HSV untuk menghasilkan sekumpulan warna. Sebagai contoh:

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

MATLAB memiliki 13 peta warna yang berbeda ( 'doc colormap' mencantumkan semuanya).

Pilihan lain untuk memplot garis dalam warna berbeda adalah menggunakan properti LineStyleOrder ; lihat Menentukan Warna Garis untuk Plotting dalam dokumentasi MATLAB untuk informasi lebih lanjut.

Azim
sumber
Sedang mencarinya. Baik-baik saja @Azim.
profesor
Demi anak cucu, saya memilih untuk menerima jawaban ini daripada hold allsolusi @Mark Elliot karena keserbagunaannya untuk dapat memilih peta warna yang berbeda.
Doresoom
Bagaimana saya bisa membuatnya bekerja menggunakan perintah "baris" plot daripada plot?
Pedro77
106

Sebenarnya, metode jalan pintas yang layak untuk mendapatkan warna untuk siklus adalah dengan menggunakan hold all;sebagai pengganti hold on;. Setiap berturut plot- turut akan berputar (secara otomatis untuk Anda) melalui peta warna default MATLAB.

Dari situs MATLAB di hold:

hold allmenahan plot dan warna garis serta gaya garis saat ini sehingga perintah pembuatan plot berikutnya tidak mereset nilai properti ColorOrder dan LineStyleOrder ke awal daftar. Perintah pembuatan plot terus berputar melalui warna dan garis yang telah ditentukan sebelumnya dari tempat plot terakhir berhenti dalam daftar.

Mark Elliot
sumber
36

Jawaban terlambat, tetapi dua hal yang perlu ditambahkan:

  • Untuk informasi tentang cara mengubah 'ColorOrder'properti dan cara menyetel default global dengan 'DefaultAxesColorOrder', lihat "Lampiran" di bagian bawah posting ini.
  • Ada alat yang hebat di MATLAB Central File Exchange untuk menghasilkan sejumlah warna yang berbeda secara visual, jika Anda memiliki Image Processing Toolbox untuk menggunakannya. Baca untuk detailnya.

The ColorOrder axesproperti memungkinkan MATLAB untuk secara otomatis siklus melalui daftar warna saat menggunakan hold on/all(sekali lagi, lihat Lampiran di bawah ini untuk cara set/ getyang ColorOrderuntuk sumbu tertentu atau global melalui DefaultAxesColorOrder). Namun, secara default MATLAB hanya menentukan daftar warna yang pendek ( hanya 7 pada R2013b) untuk digilir, dan di sisi lain mungkin bermasalah untuk menemukan kumpulan warna yang bagus untuk lebih banyak seri data. Untuk 10 plot, Anda jelas tidak bisa mengandalkan default ColorOrder.

Cara terbaik untuk menentukan N warna yang berbeda secara visual adalah dengan pengiriman "Hasilkan Warna yang Berbeda Secara Perseptual Maksimal" (GMPDC) di MATLAB Central File Exchange . Ini paling baik dijelaskan dengan kata-kata penulis sendiri:

Fungsi ini menghasilkan sekumpulan warna yang dapat dibedakan dengan mengacu pada ruang warna "Lab" , yang lebih cocok dengan persepsi warna manusia daripada RGB. Diberikan daftar besar awal kemungkinan warna, iteratif memilih entri dalam daftar yang terjauh (di ruang Lab) dari semua entri yang dipilih sebelumnya.

Misalnya, ketika 25 warna diminta:

25 "warna yang sangat berbeda secara persepsi"

Pengajuan GMPDC dipilih di blog resmi MathWorks sebagai Pick of the Week pada tahun 2010 sebagian karena kemampuan untuk meminta jumlah warna yang berubah-ubah (berbeda dengan MATLAB yang dibangun dalam 7 warna default). Mereka bahkan membuat saran yang sangat bagus untuk mengatur MATLAB ColorOrdersaat startup ke,

distinguishable_colors(20)

Tentu saja, Anda dapat menyetel ColorOrderuntuk satu sumbu atau cukup membuat daftar warna untuk digunakan sesuka Anda. Misalnya, untuk menghasilkan 10 "warna yang berbeda secara persepsi maksimal" dan menggunakannya untuk 10 plot pada sumbu yang sama ( tetapi tidak menggunakan ColorOrder, sehingga membutuhkan loop ):

% 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

Prosesnya disederhanakan, tidak memerlukan forloop, dengan ColorOrderproperti axis :

% X dari ukuran N-by-P-by-2
mpdc10 = warna_bedakan (10)
ha = sumbu; tahan (ha, 'on')
set (ha, 'ColorOrder', mpdc10)% --- atur ColorOrder DI SINI ---
plot (X (:,:, 1), X (:,:, 2), '-.')% loop TIDAK diperlukan, 'Color' TIDAK diperlukan. Yay!

LAMPIRAN

Untuk mendapatkan ColorOrderarray RGB yang digunakan untuk sumbu saat ini,

get(gca,'ColorOrder')

Untuk mendapatkan default ColorOrdersumbu baru,

get(0,'DefaultAxesColorOrder')

Contoh pengaturan global baru ColorOrderdengan 10 warna pada MATLAB mulai, di startup.m:

set(0,'DefaultAxesColorOrder',distinguishable_colors(10))
chappjc
sumber
2
Sekadar catatan, ini tampaknya membutuhkan Image Processing Toolbox.
Doresoom
2
@Doresoom Terima kasih atas infonya. Saya telah mengupdate postingan.
chappjc
12

Terlambat ke pesta. Saya sedang melihat ke dalam ini sendiri dan baru saja menemukan tentang opsi sumbu ini yang disebut ColorOrder Anda dapat menentukan urutan warna untuk sesi atau hanya untuk gambar dan kemudian hanya memplot sebuah array dan membiarkan MATLAB secara otomatis berputar melalui warna yang ditentukan.

lihat Mengubah Urutan Warna Default

contoh

set(0,'DefaultAxesColorOrder',jet(5))
A=rand(10,5);
plot(A);
xquared
sumber
1
Untuk sumbu satu kali:set(gca,'ColorOrder',jet(5));
Evgeni Sergeev
1
sangat baik hanya untuk menginformasikan tentang jet (nomor) yang tidak memerlukan kotak peralatan mewah
crobar
4

Jika semua vektor memiliki ukuran yang sama, buat matriks dan plot. Setiap kolom diplot dengan warna yang berbeda secara otomatis Kemudian Anda dapat menggunakan legenduntuk menunjukkan kolom:

data = randn(100, 5);

figure;
plot(data);

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

Atau, jika Anda memiliki sel dengan nama kernel, gunakan

legend(names)
Serg
sumber