2017-08-07 25 views
5

W jaki sposób utworzyć gradient kolorów w programie Matlab tak, aby wydrukować wykres linii 2D y = y (x), a następnie pokolorować go za pomocą innej zmiennej, która również zależy od x tak, że z = z (x). Scatter lub punktowy wątek też jest w porządku.Jak utworzyć gradient kolorów za pomocą trzeciej zmiennej w Matlab?

Chciałbym również mieć legendę w stylu colormap, która pokazuje gradient kolorów i rzeczywistą reprezentację z. Te rzeczy są dość powszechne w narzędziach do wizualizacji, takich jak VisIt i ParaView, ale nie mogłem jeszcze Zobrazować tego w Matlabie.

Odpowiedz

2

Aby nieprzerwanie manipulować kolorem linii, należy użyć wartości surface.

O ile na pierwszy rzut oka funkcja ta najbardziej przydaje się podczas rysowania powierzchni 3D, zapewnia ona większą elastyczność barwienia linii niż podstawowa funkcja plot. Możemy użyć krawędzi siatki do wykreślenia naszej linii i wykorzystać kolory wierzchołków, C, aby renderować interpolowany kolor wzdłuż krawędzi.

Można sprawdzeniu full list of rendering properties, ale te, które są najbardziej prawdopodobne, aby chciał to

  1. 'FaceColor', 'none', nie rysować twarze
  2. 'EdgeColor', 'interp' , interpolacji pomiędzy wierzchołkami

Oto przykład adaptacja MATLAB Answers post

x = 0:.05:2*pi; 
y = sin(x); 
z = zeros(size(x)); % We don't need a z-coordinate since we are plotting a 2d function 
C = cos(x); % This is the color, vary with x in this case. 
surface([x;x],[y;y],[z;z],[C;C],... 
     'FaceColor','none',... 
     'EdgeColor','interp'); 

Image produced by example

3

Jedynym sposobem, wiem to zrobić mały trick z użyciem surf:

% Create some sample data: 
x = cumsum(rand(1,20)); % X data 
y = cumsum(rand(1,20)); % Y data 
z = 1:20;    % "Color" data 

% Plot data: 
surf([x(:) x(:)], [y(:) y(:)], [z(:) z(:)], ... % Reshape and replicate data 
    'FaceColor', 'none', ... % Don't bother filling faces with color 
    'EdgeColor', 'interp', ... % Use interpolated color for edges 
    'LineWidth', 2);   % Make a thicker line 
view(2); % Default 2-D view 
colorbar; % Add a colorbar 

a działki:

enter image description here

+0

nie wydają się działać i to daje mi błąd.Na przykład; x, y i z są tego samego rozmiaru w moim problemie (zasadniczo chcę wykreślić temperaturę w stosunku do odległości i pokolorować ją na przykład ciepłem właściwym i wszystkie są 1000, 1 podwójne). – thephysicsguy

+0

@thephysicsguy: Zaktualizowałem swoją odpowiedź. Problem polegał na tym, że używałem wektorów wierszowych danych, ale wydaje się, że masz wektory kolumn danych. Uogólniłem kod do obsługi albo. – gnovice

0
  • wygenerować mapę kolorów, na przykład jet(10). Przykład wygenerowałby matrycę 10 * 3.
  • Użyj interp1, aby dokonać interpolacji między wartościami w przestrzeni RGB przy użyciu danych, ustawiając pierwszy kolor jako najniższą wartość, a ostatni jako najwyższą wartość. To wygenerowałoby macierz n * 3, gdzie n jest liczbą punktów danych.
  • Użyj scatter z opcjonalnym parametrem c, aby narysować punkty za pomocą interpolowanych kolorów.
  • Aktywuj colorbar, aby wyświetlić pasek kolorów.
+0

Nie potrzebujesz do tego celu 'jet' i' interp1', możesz użyć 'z' jako takiego. Zobacz moją odpowiedź tutaj. – EBH

3

Jeśli wykres punktowy jest w porządku, można użyć 4th input to scatter:

x = -10:0.01:10; 
y = sinc(x); 
z = sin(x); 
scatter(x,y,[],z,'fill') 

gdzie z jest kolor.

enter image description here

+0

To faktycznie działało dobrze! Nie mogę wybrać najlepszej odpowiedzi, ponieważ są to różne sposoby rozwiązania tego problemu i chciałbym je poznać, ale przegłosowałem. Szkoda, że ​​Matlab nie ma fajnej funkcji, ponieważ widzi, ile pieniędzy pobiera. – thephysicsguy

+0

Cóż, w przypadku wykresu rozrzutu mają one funkcję. Jeśli chodzi o linię, to myślę, że mniej jasne jest, jak "posegmentować" linię do barwienia. Pomyśl o tym - prawdziwa pozycja x jest nieskończenie mała, więc jaka część linii powinna być kolorowa dla konkretnego x? W ten czy inny sposób wciąż pobierają za dużo;) – EBH

Powiązane problemy