Farklı renkli çizgileri otomatik olarak çizin


112

Aynı grafik üzerinde birkaç çekirdek yoğunluğu tahminini çizmeye çalışıyorum ve hepsinin farklı renklerde olmasını istiyorum. Bir dizgi kullanan 'rgbcmyk've her bir arsa için adım adım ilerleyen kludged bir çözümüm var , ancak 7 yinelemeden sonra kopyalar almaya başlıyorum. Bunu yapmanın daha kolay / daha verimli ve daha fazla renk seçeneğiyle bir yolu var mı?

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
Sadece "hepsini tut" mu yapmayı denedin? Bu, her yeni çizim komutu için otomatik olarak haber renkleri çizer.
twerdster

3
"hepsini tut", asıl sorunun cevabı değildir, ancak burada biten birçok kişi için bir çözüm olabilir, çünkü yalnızca "bekletme" tüm eğrileri mavi olarak çizer. @Twerdster'a çok teşekkürler!
Rémi

8
İtibariyle R2014b , olağan hold onolduğu işlevsel olarak eşdeğer için hold all. Bununla birlikte, 7 varsayılan renkten daha fazlasını nasıl elde edeceğiniz sorusu kalır. Varsayılan bir renk haritası, Azim tarafından açıklandığı gibi bir çözüm olabilir veya aşağıdaki gibi kolay görsel ayrım için ayarlanmış renkler üretme işlevi kullanılabilir .
chappjc

1
Kullandığımda hold allfarklı renklerde grafikler elde ediyorum (oldukça donuk göründüklerini söylemem gerekse de), oysa kullandığımda hold ontüm grafiklerim mavi oluyor. Bu yüzden işlevsel denkliğin ne olduğunu merak ediyorum.
HelloGoodbye

4
@HelloGoodbye R2014b ve daha yeni sürümlerde hold onfarklı renk grafikleri verir. Kullanıyorsunuz ve eski sürümü. Gönderen akım docs , " hold allaynıdır hold on. Not: . Bu sözdizimi bir sürümde kaldırılacaktır Kullanım hold onyerine." Ayrıca sürüm notlarına bakın .
chappjc

Yanıtlar:


131

Bir dizi renk oluşturmak için HSV gibi bir renk haritası kullanabilirsiniz. Örneğin:

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

MATLAB'ın 13 farklı adlandırılmış renk haritası vardır ( 'doc colormap' hepsini listeler).

Farklı renklerde çizgiler çizmek için başka bir seçenek LineStyleOrder özelliğini kullanmaktır ; Daha fazla bilgi için MATLAB belgelerinde Çizilecek Çizgilerin Rengini Tanımlama konusuna bakın .


Onu arıyordum. İyi ol @Azim.
profesör

Gelecek nesillerin iyiliği için, hold allfarklı renk haritaları seçebilme çok yönlülüğü nedeniyle bu cevabı @Mark Elliot'ın çözümü yerine kabul etmeyi seçtim .
Doresoom

Plot yerine "line" plot komutunu kullanarak çalışmasını nasıl sağlayabilirim?
Pedro77

106

Aslında döngüsüne renkleri elde etmek için iyi bir kısayol yöntemi kullanmaktır hold all;yerine hold on;. Her bir ardışık plot, MATLAB'ın varsayılan renk haritası aracılığıyla (sizin için otomatik olarak) dönecektir.

MATLAB sitesinden hold:

hold allgrafiği ve geçerli çizgi rengini ve çizgi stilini tutar, böylece sonraki çizim komutları ColorOrder ve LineStyleOrder özellik değerlerini listenin başına sıfırlamaz. Çizim komutları, listedeki son grafiğin durduğu yerden önceden tanımlanmış renkler ve çizgi stilleri arasında dönmeye devam eder.


36

Geç cevap, ancak eklenecek iki şey var:

  • 'ColorOrder'Özelliğin nasıl değiştirileceği ve genel bir varsayılanın nasıl ayarlanacağı hakkında bilgi için 'DefaultAxesColorOrder', bu yazının altındaki "Ek" bölümüne bakın.
  • MATLAB Merkezi Dosya Değişimi'nde, kullanmak için Görüntü İşleme Araç Kutunuz varsa, görsel olarak farklı renklerin herhangi bir sayısını oluşturmak için harika bir araç vardır. Ayrıntılar için okumaya devam edin.

Bu ColorOrder axesözellik , MATLAB'ın kullanırken bir renk listesi arasında otomatik olarak geçiş yapmasına izin verir hold on/all(yine, belirli bir eksen için veya genel olarak nasıl yapılacağı set/ getyapılacağı ColorOrderiçin aşağıdaki Ek'e bakın DefaultAxesColorOrder). Bununla birlikte, varsayılan olarak MATLAB, geçiş yapmak için yalnızca kısa bir renk listesi ( R2013b'den itibaren yalnızca 7 ) belirtir ve diğer yandan, daha fazla veri serisi için iyi bir renk kümesi bulmak sorunlu olabilir. 10 arsa için, açıkça varsayılana güvenemezsiniz ColorOrder.

İçin harika bir yoldur N görsel olarak ayrı renkleri tanımlamak ile MATLAB Merkez Dosya Dosya Exchange "Maksimum olarak algısal-Farklı Renkler üret" (GMPDC) sunulması . En iyi şekilde yazarın kendi sözleriyle açıklanır:

Bu işlev , insan renk algısına RGB'den daha yakından eşleşen "Lab" renk uzayına referansla ayırt edilebilen bir dizi renk oluşturur . Olası renklerin ilk büyük listesi verildiğinde, önceden seçilmiş tüm girişlerden en uzaktaki (Lab alanında) girişi yinelemeli olarak seçer.

Örneğin 25 renk istendiğinde:

25 "algısal olarak maksimum farklı renk"

GMPDC gönderimi, MathWorks'ün resmi blogunda , kısmen isteğe bağlı sayıda renk talep etme yeteneği nedeniyle ( MATLAB'ın 7 varsayılan renkte yerleşik olarak) 2010'da Haftanın Seçimi olarak seçildi . MATLAB'leri ColorOrderbaşlangıçta ayarlamak için mükemmel bir öneri bile yaptılar:

distinguishable_colors(20)

Elbette, ColorOrdertek bir eksen için ayarlayabilir veya istediğiniz şekilde kullanmak için bir renk listesi oluşturabilirsiniz. Örneğin, 10 "algısal olarak maksimum farklı renk" oluşturmak ve bunları aynı eksende 10 çizim için kullanmak ( ancak kullanmamak ColorOrder, dolayısıyla bir döngü gerektirir ):

% 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

İşlem, eksen özelliği ile döngü gerektirmedenforColorOrder basitleştirilmiştir :

N-by-P-by-2 boyutunun% X'i
mpdc10 = ayırt edilebilir_renkler (10)
ha = eksenler; tutma (ha, 'açık')
set (ha, 'ColorOrder', mpdc10)% - ColorOrder'ı BURADAN ayarlayın ---
plot (X (:,:, 1), X (:,:, 2), '-.')% döngü gerekli DEĞİL, 'Renk' gerekli DEĞİLDİR. Yaşasın!

EK

Almak için ColorOrdergeçerli eksen için kullanılan RGB dizisi,

get(gca,'ColorOrder')

ColorOrderYeni eksenler için varsayılanı almak için ,

get(0,'DefaultAxesColorOrder')

ColorOrderMATLAB başlangıcında 10 renk ile yeni global ayarlama örneği startup.m:

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

2
Sadece bir not, bu Görüntü İşleme Araç Kutusu gerektiriyor gibi görünüyor.
Doresoom

2
@Doresoom Bilgi için teşekkürler. Gönderiyi güncelledim.
chappjc

12

Partiye geç. Bunu kendim araştırıyordum ve ColorOrder adlı bu eksen seçeneğini buldum, oturum için veya sadece şekil için renk sırasını belirleyebilir ve ardından sadece bir dizi çizebilir ve MATLAB'ın belirtilen renkler arasında otomatik olarak dönmesine izin verebilirsiniz.

bkz . Varsayılan Renk Sırasını Değiştirme

misal

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

1
Bir defalık eksen için:set(gca,'ColorOrder',jet(5));
Evgeni Sergeev

1
herhangi bir süslü araç kutusu gerektirmeyen jet (sayı) hakkında bilgi vermek için mükemmel
crobar

4

Tüm vektörlerin boyutu eşitse, bir matris oluşturun ve grafiğini çizin. Her sütun otomatik olarak farklı bir renkle çizilir. Ardından legendsütunları belirtmek için kullanabilirsiniz :

data = randn(100, 5);

figure;
plot(data);

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

Veya çekirdek adlarına sahip bir hücreniz varsa,

legend(names)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.