2014-09-16 4 views
1

Я пытаюсь настроить масштаб оси x, чтобы значения были ближе друг к другу, но я не могу этого сделать.Настройка шкалы по оси x на гистограмме в MATLAB

Мне нужен выход, чтобы быть похожим на эту фотографию:

enter image description here

Однако то, что я на самом деле получить это фото ниже:

enter image description here

Вот код, который я написал воспроизведите эту ошибку:

x = [0.1 1 10 100 1000 10000]; 
    y = [1.9904 19.8120 82.6122 93.0256 98.4086 99.4016]; 
    figure; 
    bar(x,y); 
    ylabel('Y values'); 
    xlabel('X values'); 
    set(gca,'XTick', [0.1 1 10 100 1000 10000]) 

Как настроить ось x так, чтобы она выглядела как первая фотография?

ответ

4

Поскольку ваши данные имеют такой огромный динамический диапазон, и из-за линейного поведения оси x, ваш график, естественно, будет выглядеть так. Один из компромиссов, который я могу предложить, заключается в том, что вы преобразовываете свои данные x, чтобы они отображались в меньшем масштабе, а затем переназначайте ваши данные x, чтобы они попадали на небольшую экспоненциальную шкалу. После этого просто зарисуйте данные, используя этот переназначенный масштаб, затем переименуйте отметки x, чтобы они имели те же значения, что и ваши данные x. Для этого сначала возьмем log10 ваших данных, а затем примените экспоненциальные данные. Таким образом, вы масштабируете координаты x до меньшего динамического диапазона. Когда вы применяете экспоненту к этому меньшему диапазону, координаты x затем будут распределяться поэтапно, где более высокие значения x, несомненно, сделают это значение дальше по оси x, но не слишком далеко, как вы видели в ваш оригинальный сюжет.

Таким образом, попробовать что-то вроде этого:

x = [0.1 1 10 100 1000 10000]; %// Define data 
y = [1.9904 19.8120 82.6122 93.0256 98.4086 99.4016]; 
xplot = (1.25).^(log10(x)); %// Define modified x values 
figure; 
bar(xplot,y); %// Plot the bar graph on the modified scale 
set(gca,'XTick', xplot); %// Define ticks only where the bars are located 
set(gca,'XTickLabel', x); %// Rename these ticks to our actual x data 

Это то, что я получаю:

enter image description here

Обратите внимание, что вы должны будете играть вокруг с базой экспоненциальный, что составляет 1,25 в том, что я сделал, в соответствии с вашими данными. Очевидно, что чем больше динамический диапазон ваших данных x, меньше этот показатель должен быть для того, чтобы ваши данные были ближе друг к другу.


Редактировать от ваших комментариев

Из ваших комментариев, вы хотите бруски быть равноудаленные между соседними барами. Таким образом, вам просто нужно сделать ось x линейной в небольшом диапазоне, от ... скажем ... 1 до общего числа значений x. Затем вы применяете ту же логику, в которой мы переименуем тики на оси x, чтобы они были от истинных значений x. Таким образом, вам нужно изменить только одну строку, которая равна xplot. Остальные линии должны оставаться неизменными.Поэтому:

x = [0.1 1 10 100 1000 10000]; %// Define data 
y = [1.9904 19.8120 82.6122 93.0256 98.4086 99.4016]; 
xplot = 1:numel(x); %// Define modified x values 
figure; 
bar(xplot,y); %// Plot the bar graph on the modified scale 
set(gca,'XTick', xplot); %// Define ticks only where the bars are located 
set(gca,'XTickLabel', x); %// Rename these ticks to our actual x data 

Это то, что я получаю:

enter image description here

+0

Спасибо Рэй, , но мне интересно, если х = [0,1 1 5 10 12 15] .. как я могу управлять оси х значения? потому что я использую случайные значения для x. Также как я могу сделать равное расстояние между каждым баром? – SMH

+0

@ User436823 - Вы хотите, чтобы бары всегда были равны друг другу? Если это так, просто заговорите между 1 и многими значениями, которые у вас есть 'x', затем переименуйте тики, чтобы они были такими же, как ваши значения' x'. Если это действительно то, что вы хотите, я изменю свое сообщение, чтобы это отразить. – rayryeng

+0

Да. Это именно то, что я хочу сделать. – SMH

Смежные вопросы