Поскольку ваши данные имеют такой огромный динамический диапазон, и из-за линейного поведения оси 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
Это то, что я получаю:
Обратите внимание, что вы должны будете играть вокруг с базой экспоненциальный, что составляет 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
Это то, что я получаю:
Спасибо Рэй, , но мне интересно, если х = [0,1 1 5 10 12 15] .. как я могу управлять оси х значения? потому что я использую случайные значения для x. Также как я могу сделать равное расстояние между каждым баром? – SMH
@ User436823 - Вы хотите, чтобы бары всегда были равны друг другу? Если это так, просто заговорите между 1 и многими значениями, которые у вас есть 'x', затем переименуйте тики, чтобы они были такими же, как ваши значения' x'. Если это действительно то, что вы хотите, я изменю свое сообщение, чтобы это отразить. – rayryeng
Да. Это именно то, что я хочу сделать. – SMH