2013-05-21 10 views
5

Czy możliwe jest pokolorowanie pojedynczej liczby (lub zestawu liczb) na jednej z osi w programie MATLAB?Jak mogę przypisać wiele kolorów do zaznaczania etykiet na działkach w programie MATLAB?

Załóżmy, że ma wykres:

plot(1:10, rand(1,10)) 

Teraz można np czy numer 3 na osi X jest czerwony?

+0

Czy to jest etykieta x-tick, którą chcesz zmodyfikować? – Schorsch

+0

Tak, jest to etykieta X-tick. –

+2

Proszę zobaczyć drugą część odpowiedzi na [to pytanie] (http://stackoverflow.com/questions/16532176/how-to-add-marker-to-matlab-colorbar/16532405#16532405) - powinieneś być w stanie zmodyfikować go, aby zmienić kolor pojedynczego tiknięcia, zamiast go pogrubiać (i używać go na normalnych osiach zamiast na kolorowym pasku). – wakjah

Odpowiedz

8

Niestety, nie można mieć wielu kolorów dla etykiet zaznaczania w jednym obiekcie osi. Istnieje jednak rozwiązanie (inspirowane przez this page from MathWorks support site), które zapewnia ten sam efekt. Nakłada on istniejące osie na inne osie, które mają tylko jeden czerwony tyk.

Oto przykład:

figure 
plot(1:10, rand(1,10)) 
ax2 = copyobj(gca, gcf);        %// Create a copy the axes 
set(ax2, 'XTick', 3, 'XColor', 'r', 'Color', 'none') %// Keep only one red tick 
ax3 = copyobj(gca, gcf);        %// Create another copy 
set(ax3, 'XTick', [], 'Color', 'none')    %// Keep only the gridline 

Wynikiem jest:

result

+2

+1 uderzył mnie w cios: P BTW, zdawałem sobie sprawę, że możesz to zrobić bez kopiowania zawartości osi, ustawiając '' Color'' na none, a następnie dając nałożone osie puste ''YLim'' i tym samym '' XLim''. – wakjah

+0

@wakjah Nie śledzę, który obiekt muszę ustawić dla '' Color''? –

+0

Zamiast robić 'copyobj', możesz po prostu utworzyć drugą' osie' i ustawić 'Color' na tym; ustawienie go na "none" spowoduje, że tło będzie przezroczyste. – wakjah

3

Jako alternatywę dla kopiowania całej zawartości osie, to jest możliwe, aby to zrobić także poprzez tworzenie dodatkowych axes przedmiotów :

ax = axes(); 
p = plot(1:10, rand(1,10)); 
myTick = 3; 

% Create new axes with transparent backgrounds 
ax2 = axes(); 
ax3 = axes(); 
set([ax2 ax3], 'XLim', xlim(ax)); 
set([ax2 ax3], 'Color', 'none'); 

set(ax3, 'XTick', [], 'YTick', []); 

% Give one new axes a single tick mark 
set(ax2, 'YTick', []); 
set(ax2, 'XTick', myTick); 
set(ax2, 'XColor', 'r'); 

% This line is necessary to use the plot toolbar functions like zoom/pan 
linkaxes([ax ax2 ax3]); 
+0

+1: nie potrzebujesz 'linkaxes' jeśli ustawiasz' XLim' ręcznie;) –

+0

Robisz, jeśli chcesz użyć powiększenia paska narzędzi :) – wakjah

+0

Dobrze :) Również ty może zrobić 'xlim (ax)' zamiast 'get (ax, 'XLim')', jest krótszy. –

4

Pojedyncze etykiety zaznaczenia można zabarwić przy użyciu tex markup, które domyślnie są włączone dla etykiet zaznaczania. Jest zdefiniowany we właściwości osi.

Zapewnia dwa polecenia do kolorowania tekstu:

  • \color{<name>}, gdzie <name> jest nazwą koloru jak „czerwony” lub „zielony” i
  • \color[rgb]{<R>,<G>,<B>}, gdzie <R>, <G> i <B> są numery między 0 i 1 i określ kolor RGB.

Polecenia te mogą być stosowane do barwienia pojedynczych etykiet podziałki:

plot(1:10, rand(1,10)) 
ax = gca; 

% Simply color an XTickLabel 
ax.XTickLabel{3} = ['\color{red}' ax.XTickLabel{3}]; 

% Use TeX symbols 
ax.XTickLabel{4} = '\color{blue} \uparrow'; 

% Use multiple colors in one XTickLabel 
ax.XTickLabel{5} = '\color[rgb]{0,1,0}green\color{orange}?'; 

% Color YTickLabels with colormap 
nColors = numel(ax.YTickLabel); 
cm = jet(nColors); 
for i = 1:nColors 
    ax.YTickLabel{i} = sprintf('\\color[rgb]{%f,%f,%f}%s', ... 
     cm(i,:), ax.YTickLabel{i}); 
end 

I tak wynik wygląda:

result

kod pracował dla mnie w MATLAB R2016b i R2017a.

+0

To wygląda świetnie! Nie mogę tego przetestować, ponieważ nie mam już MATLAB. :( –

+0

To całkiem sprytnie, tak jak w przypadku wielu nowych poręcznych funkcji graficznych, to działa tylko dla HG2, oczywiście dla wersji MATLAB> = R2014b. – Hoki

Powiązane problemy