Гистограмма X-оси Matlab - PullRequest
       23

Гистограмма X-оси Matlab

0 голосов
/ 30 декабря 2018

Я застрял с гистограммой в Matlab.Я получил его для работы с помощью Matlab и на этом форуме, пока здесь, но на оси X есть только 2 имени.Я хотел бы иметь «имена» под решеткой и «категории», где сейчас отображаются 2 имени.Спасибо!

values = [4 10...
    11 2 3;...
    4 1...
    5 2 -10];
names = {'PreSplitTotalEON' 'PostSplitTotalEON'...
    'PreSplitPureEON' 'PostSplitPureEON' 'PostSplitUniper';...
    'PreSplitTotalRWE' 'PostSplitTotalRWE'...
    'PreSplitPureRWE' 'PostSplitPureRWE' 'PostSplitInnogy'};
categories = {'EON', 'RWE'};
b = bar(values,'FaceColor','flat');
xticklabels([names(1,:)';names(2,:)'])         
% This will set labels to be used for each tick of the x-axis
xticks(1:1:length([names(1,:)';names(2,:)']))
% This will set how many ticks you want on the x-axis. Here, there
% should be 48 ticks being generated. One for each piece of data you have.
xtickangle(90)
% This will rotate the label so that the labels will not overlap
% with one another. This is in degrees.
for k = 1:size(values,2) % for fancier colors.
    b(k).CData = k;
end

Ответы [ 3 ]

0 голосов
/ 31 декабря 2018
  • Необходимо наблюдать ось x на графике и приблизить начальные и конечные значения оси X для стержней.
  • При проверке было установлено, что стержни начинаются с 0,54 (зазор) на оси x и заканчивается около 2.32.
  • Затем разделите ось x на 12 позиций тиков, используя команду xticks,
  • , а затем отметьте эти позиции требуемыми меткамииспользуя команду xticklabels.Вот и все.

Код, необходимый для этого, приведен ниже.

close all
clear all

values = [4 10 ...
    11 2 3; ...
    4 1 ...
    5 2 -10];

% just declare the names lables as a simple 1-D cell array
% remove the columns and construct as row wise cell array
names = {'PreSplitTotalEON','PostSplitTotalEON', ...
    'PreSplitPureEON', 'PostSplitPureEON', 'PostSplitUniper', ...
    'PreSplitTotalRWE', 'PostSplitTotalRWE', ...
    'PreSplitPureRWE', 'PostSplitPureRWE', 'PostSplitInnogy'};
% declare the categories label
categories = {'EON', 'RWE'};
% construct the bar
b = bar(values,'FaceColor','flat');

%-> mark the respective xticks <-
% on close inspepection, it was found that the bars starts
% near 0.54 and end at nearly 2.31 at the x-axis
% so divide the x axis in 12 ticks within those limits.
xticks([linspace(0.54, 2.31, 12)]);

% now put the lables at those limits, that all
xticklabels({categories{1}, names{1:5}, categories{2}, names{6:10}})

xtickangle(90)
% This will rotate the label so that the labels will not overlap
% with one another. This is in degrees.
for k = 1:5 % for fancier colors.
    b(k).CData = k;
end

Выход enter image description here

0 голосов
/ 01 января 2019

Вот исправление для вашего кода для получения желаемого результата (объяснения внутри):

values = [4 10 11 2 3;
          4 1 5 2 -10];
names = {'PreSplitTotal' 'PostSplitTotal'...
    'PreSplitPure' 'PostSplitPure' 'PostSplitUniper';...
    'PreSplitTotal' 'PostSplitTotal'...
    'PreSplitPure' 'PostSplitPure' 'PostSplitInnogy'}.'; % <-- note the transpose!
categories = {'EON', 'RWE'};
N_names = size(values,2);
ax = axes('NextPlot','add'); % <-- same as 'hold on'
col = lines(N_names); % choose your favorite colormap
% draw the bars in pairs by their 'names':
for k = 1:N_names % for fancier colors.categories
    b = bar(ax,[k k+N_names+1],values(:,k),0.15,...
        'FaceColor',col(k,:));
end
xticks([1:N_names (N_names+2:N_names*2+1)]) % does not crate a tick for the space between categories
xticklabels(names(:))
xtickangle(30)
% place the category name on top of the axes:
text(ceil(N_names/2)+[0 N_names+1],ax.YLim(2).*[1 1],categories,...
    'VerticalAlignment','bottom','HorizontalAlignment','center')

enter image description here

0 голосов
/ 30 декабря 2018

По умолчанию будет использоваться legend для отображения имени каждого элемента в группе.Но положение каждого бара можно узнать через свойства XOffset и XData.См. этот ответ в matlab central.

Так что вы можете использовать что-то вроде:

ticksList = b(1).XData+arrayfun(@(x)x.XOffset, b)';
xticks(ticksList(:))
xticklabels([names(1,:)';names(2,:)'])

, чтобы правильно отображать имена под каждым столбцом.Тем не менее, я не вижу, как вы хотите отображать имена каждого бара и категории вместе под барами без наложения.Вместо этого вы можете отображать категории сверху, создавая новые оси.Добавление Что-то вроде:

ax1 = gca;
ax2 = axes('Position', get(ax1, 'Position'),'Color', 'none');
set(ax2, 'XAxisLocation', 'top','YAxisLocation','Right');
set(ax2, 'XLim', get(ax1, 'XLim'),'YLim', get(ax1, 'YLim'));
xticks(b(1).XData)
xticklabels(categories)

Т.е. полный код был бы теперь:

clear all
close all

values = [4 1 11 2 3; 4 1 5 2 -10];
names = {'Pre split total EON' 'Post split total EON'...
    'Pre split pure EON' 'Post split pure EON' 'Post split Uniper';...
    'Pre split total RWE' 'Post split total RWE'...
    'Pre split pure RWE' 'Post split pure RWE' 'PostSplitInnogy'};
categories = {'EON','RWE'};
figure;
b = bar(values,'FaceColor','flat');
ticksList = b(1).XData+arrayfun(@(x)x.XOffset, b)';
xticks(ticksList(:))
xticklabels([names(1,:)';names(2,:)'])
xtickangle(90)
ax1 = gca;
ax2 = axes('Position', get(ax1, 'Position'),'Color', 'none');
set(ax2, 'XAxisLocation', 'top','YAxisLocation','Right');
set(ax2, 'XLim', get(ax1, 'XLim'),'YLim', get(ax1, 'YLim'));
set(ax2, 'YTick', []);
xticks(b(1).XData)
xticklabels(categories)
for k = 1:size(values,2) % for fancier colors.
    b(k).CData = k;
end

Figure output

...