Matlab: массив графиков, так что каждое значение имеет случайную форму и цветовую карту - PullRequest
0 голосов
/ 05 апреля 2019

В Matlab:

Как изменить график (x, y, 'o'), где x = 1: 10 и y = единиц (1,10), чтобы каждая точка на графике имела случайную форму?

А как я могу дать ему цвета, выбранные из схемы, где значение при x = 1 является самым темным синим, а x = 10 красным (а именно, какая-то тепловая карта)?

Можно ли это сделать без использования циклов? Возможно, мне следует заменить «plot» другой функцией для этой цели (например, «scatter»? Я не знаю ...)? Причина в том, что я планирую это внутри другого цикла, который уже очень длинный, поэтому я заинтересован в сокращении времени выполнения.

Спасибо!

1 Ответ

5 голосов
/ 05 апреля 2019

Во-первых, простой код:

x = 1:20;
nx = numel(x);
y = ones(1, nx);

% Color map
cm = [linspace(0, 1, nx).' zeros(nx, 1) linspace(1, 0, nx).'];

% Possible markers
m = 'o+*.xsd^vph<>';
nm = numel(m);

figure(1);
hold on;

for k = 1:nx

  plot(x(k), y(k), ...
    'MarkerSize', 12, ...
    'Marker', m(ceil(nm * (rand()))), ...
    'MarkerFaceColor', cm(k, :), ...
    'MarkerEdgeColor', cm(k, :) ...
    );

end

hold off;

А, на выходе:

Output

Большую часть этого можно найти в справке MATLAB для команды plot, в разделе Укажите ширину линии, размер маркера и цвет маркера . Цветовые карты - это просто n x 3 матрицы со значениями RGB в диапазоне от 0 до 1. Итак, я интерпретировал самый темный синий как [0 0 1], тогда как простой красный - [1 0 0]. Теперь вам просто нужна линейная «интерполяция» между этими двумя значениями n. Перемешивание типа маркера выполняется простым rand. (Конечно, можно заранее создать вектор rand с размером n.) Я не совсем уверен, можно ли все это поместить в одну команду plot, но я настроен весьма скептически. Таким образом, использование цикла было самым простым способом прямо сейчас.

...