Как создать картинку, которая заполняет цвета на основе матрицы? - PullRequest
1 голос
/ 17 февраля 2020

У меня есть массив ячеек в MATLAB в следующем формате:

aa = {[1 2],[2 3],[1 2 3 4 5 6],[5],[1]}

Можно ли создать диаграмму в этом стиле (т. Е. Заполнять цветом блока каждый раз, когда появляется число)?

enter image description here

Ответы [ 2 ]

6 голосов
/ 17 февраля 2020

Вот возможное решение на основе pcolor:

aa = {[1 2],[2 3],[1 2 3 4 5 6],[5],[1]};
n_rows = length(aa);
n_columns = max(cell2mat(aa));
m = zeros(n_rows + 1, n_columns + 1);
row = n_rows;
for i=1:n_rows
    m(row, aa{i}) = 1;
    row = row - 1;
end
colormap([1 1 1; 1 0.5 0]);
pcolor(m);

, которое дает следующий результат:

enter image description here

4 голосов
/ 17 февраля 2020

Поскольку в вашем массиве ячеек есть векторы различной длины, вам нужно будет перебрать их в некотором l oop (или аналогично, см. cellfun, используемый ниже). Остальное - инициализация некоторой матрицы с вашим желаемым значением фона и установка всех «пикселей» внутри этой матрицы на желаемое значение переднего плана.

Вот небольшой фрагмент кода (протестировано с Octave 5.1.0 и MATLAB Online):

aa = {[1 2], [2 3], [1 2 3 4 5 6], [5], [1]}

% Determine needed number of rows and columns
r = size(aa, 2);
c = max(cellfun(@max, aa));

% Initialize and fill matrix
A = 255 * ones(r, c);
for I = 1:r
  A(I, aa{I}) = 128;
end

% Show matrix with some colormap and labels
figure('Position', [300, 300, 800, 400]);
imagesc(A, [0, 255]);
colormap('hot');
set(gca, ...
  'FontSize', 12, ...
  'TickLength', [0 0], ...
  'XTick', [1:c], ...
  'XTickLabel', [repmat('V', c, 1) num2str([1:c].')], ...
  'YTick', [], ...
  'XAxisLocation', 'Top');

Результат выглядит следующим образом:

Output

(Вместо того, чтобы устанавливать правильные цвета, я просто использовал некоторое изображение в градациях серого с Цветная карта здесь.)

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...