Несколько гистограмм на одном графике в Октаве - PullRequest
0 голосов
/ 17 мая 2018

Использование Octave 4.2.1 в Windows с графическим инструментарием qt (я не могу использовать gnuplot, потому что он падает в какой-то другой части кода).У меня есть набор данных размером 35x7x4 (35 точек данных для 7 условий на 4 каналах) - для этого упражнения вы можете использовать случайные данные.

Я пытаюсь создать 4 вспомогательных участка (по 1 для каждого канала)с 7 гистограммами на каждом участке (по одному на условие), чтобы увидеть, как распределение данных изменяется с каждым условием.Каждое из дистрибутивов 7x4 = 28 имеет свой собственный набор интервалов и частот, и я не могу объединить 7 наборов данных на одном графике (подзаговор).

Размещение всего кода будетбыть слишком сложным, но вот упрощенная версия:

nb_channels = 4;
nb_conditions = 7;
nbins = 15;
freq = zeros(nbins,nb_conditions,nb_channels);
xbin = zeros(nbins,nb_conditions,nb_channels);

plot_colours = [91 237 165 255 68 112 255;
  155 125 165 192 114 173 0;
  213 49 165 0 196 71 255];
plot_colours = plot_colours / 255;

for k = 1:nb_channels
  for n = 1:nb_conditions
    % some complex calculations to generate temp variable
    [freq(:,n,k),xbin(:,n,k)] = hist(temp,nbins);
  end
end

figure
for k = 1:nb_channels
  subplot(2,2,k)
  for n = 1:nb_conditions
    bar(xbin(:,n,k),freq(:,n,k),'FaceColor',plot_colours(:,n))
    hold on
  end
  hold off
  legend('condition #1','condition #2','condition #3','condition #4','condition #5','condition #6','condition #7')
end

, которая дает что-то вроде этого:

enter image description here

Так что вы можете 'На самом деле ничего не видно, все полосы находятся друг над другом.Кроме того, Octave не поддерживает свойство прозрачности для объектов исправлений (именно это и используют гистограммы), поэтому я не могу наложить гистограммы друг на друга, что я действительно очень хотел бы сделать.

Есть ли лучший способ подойти к этому?Кажется, что bar будет принимать только вектор для данных x, а не матрицу, поэтому я застрял в необходимости использовать hold on и проходить через различные условия вместо использования матричного подхода.

1 Ответ

0 голосов
/ 18 мая 2018

ОК, поэтому я постараюсь ответить на свой вопрос, основываясь на предложениях, высказанных в комментариях:

Предложение 1: сделать все ячейки одинаковыми

Это улучшит результатыдо некоторой степени, но это все еще проблема из-за отсутствия прозрачности для объектов исправлений.

Изменения кода:

nbins = 15;
xbin = linspace(5.8,6.5,nbins);

for k = 1:nb_channels
  for n = 1:nb_conditions
    % some complex calculations to generate temp variable
    freq_flow(:,n,k) = hist(temp,xbin);
  end
end

figure
for k = 1:nb_channels
  subplot(2,2,k)
  for n = 1:nb_conditions
    bar(xbin,freq_flow(:,n,k),'FaceColor',plot_colours(:,n))
    hold on
  end
  hold off
  xlim([5.8 6.3])
  legend('condition #1','condition #2','condition #3','condition #4','condition #5','condition #6','condition #7')
end

Что дает следующий график:

enter image description here

Предложение 2: Используйте линейные графики вместо гистограмм

Это немного больше помогает с точки зрения читабельности.Тем не менее, результат немного «поштучно».

Изменения кода:

 figure
    for k = 1:nb_channels
      subplot(2,2,k)
      for n = 1:nb_conditions
        plot(xbin,freq_flow(:,n,k),'LineStyle','none','marker','.',...
            'markersize',12,'MarkerEdgeColor',plot_colours(:,n),...
            'MarkerFaceColor',plot_colours(:,n))
        hold on
      end
      hold off
      xlim([5.8 6.3])
      legend('condition #1','condition #2','condition #3','condition #4','condition #5','condition #6','condition #7')
    end

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

enter image description here

Легенда немного испорчена, но я, вероятно, смогу разобраться с этим.

Разновидность, которую я также попробовал, состояла в том, чтобы построить только точки в качестве маркеров, а затем подобрать нормальное распределениенаверху.Я не буду публиковать здесь весь код, но результат выглядит примерно так:

enter image description here

Предложение 3: обход прозрачности с помощью gnuplot

К сожалению, до того, как я попал в обход прозрачности, gnuplot продолжает падать при попытке построить фигуру.Я думаю, что есть кое-что, что не нравится в сюжетах и ​​легендах (именно поэтому я в первую очередь перешел на qt графический инструментарий, поскольку у меня была точно такая же проблема в других частях кода).

Решение 4: использовать 3D-гистограмму

Я нашел это на SO: 3D-гистограмма с gnuplot или октавой

и использовал ее так:

figure
for k = 1:size(flow_factor,2)
  subplot(2,2,k)
  h = my_bar3(freq_flow(:,:,k));
  fvcd = kron((1:numel(freq_flow(:,:,k)))', ones(6,1));
  set(h, 'FaceVertexCData',fvcd, 'FaceColor','flat', 'CDataMapping','scaled')
  colormap hsv; axis tight; view(50,25)
  ylbl = cell(length(xbin),1);
  for k=1:length(xbin)
    ylb{k} = num2str(xbin(k));
  end
  set(gca,'YTick',1:2:nbins);
  set(gca,'YTickLabel',ylb(1:2:end));
end

для получения:

enter image description here

Что неплохо, но, вероятно, не так ясно, как линейные графики.

Заключение

В целом, я, вероятно, в конечном итоге буду использовать один из подходов линейных графиков, поскольку они имеют тенденцию быть более четкими.

...