Matlab и XTickLabel

Я пытался заставить Matlab изменить маркировку на моих контурных графиках уже около часа. Когда я собираюсь изменить XTickLabel или XTick, он просто полностью удаляет мою ось X! Разочаровывает и бесит то, что я делаю точно то, что все справочные страницы и справочные форумы просят меня сделать - я честно не понимаю, почему это не работает.

Следовательно, я здесь.

Мой код построения графика (знание функции не требуется - код довольно интенсивный. Однако это двухмерный контурный график с действительными данными и диапазонами - проблема заключается в осях, а не в графике):

   contourf(time,f,power,levels)
   colormap(jet(levels))
   set(gca,'XTickLabelMode','manual')
   set(gca, 'XTick', 0:23);
   set(gca, 'XTickLabel', {'0';'1';'23'});
   xlabel('Time (UT)')
   ylabel('Frequency (Hz)')
   caxis([0,8])
   axis([0 StopTime 0 0.1])

Любая помощь будет принята с благодарностью!


person Yoshi    schedule 04.11.2014    source источник
comment
Сюжет - это или не проблема? ;) Кроме того, возможно, стоит указать ссылку на страницу справки, которую вы упомянули.   -  person JoErNanO    schedule 04.11.2014
comment
mathworks.com/matlabcentral/answers/ mathworks.com.au/help/matlab/ref/axes-properties.html Ни то, ни другое не помогло - насколько я знаю, я делаю именно то, что мне говорят! И сам график не проблема - мне нужно изменить оси (в частности, метки/галочки).   -  person Yoshi    schedule 04.11.2014
comment
Как вы пытаетесь изменить XTickLabel или XTick? И на что вы собираетесь его/их менять?   -  person Divakar    schedule 04.11.2014
comment
Насколько я знаю (что не очень далеко - я довольно новичок в этом уровне кодирования Matlab), я меняю настройки обработчика осей «Xtick» и «XTickLabel». В настоящее время они просто содержат значения моих массивов (чего я не хочу). Я хочу изменить ось X на время UT - от 0 до 23 с равными приращениями (от 1).   -  person Yoshi    schedule 04.11.2014
comment
Не могли бы вы предоставить нам некоторые образцы данных для time, f, power, levels для воспроизводимости?   -  person JoErNanO    schedule 04.11.2014
comment
Не без проверки всего моего кода, а также файлов, из которых я читаю эту информацию. Все, что мне нужно сделать, это переименовать ось. Информация на графике не нужна - сам график работает нормально. Я просто хочу перемаркировать оси. Но это может помочь: i62.tinypic.com/23mm23o.jpg   -  person Yoshi    schedule 04.11.2014
comment
Вы можете просто предоставить усеченные версии этих векторов/матриц, содержащих 10 точек данных. Это помогает нам запускать ваш код и получать результат, близкий к ожидаемому.   -  person JoErNanO    schedule 04.11.2014


Ответы (3)


Решено:

Я понял, что «XTick» полагался на текущие значения массива, который я использовал для определения оси X. Я не могу просто предположить, что Matlab будет равномерно распределять новый массив (по крайней мере, если есть способ сделать это, я не знаю). Итак, поскольку у меня есть 85 680 точек данных по оси X, я просто масштабировал их следующим образом:

   set(gca, 'XTick', 0:3570:85680)
   set(gca, 'XTickLabel', num2cell(0:24))

Мораль истории: Matlab не позволяет вам произвольно накладывать новую ось на старую, используя эти две функции.

person Yoshi    schedule 04.11.2014

У вас есть последняя команда axis([0 StopTime 0 0.1])), которая очищает ваш график, создавая новую новую ось. Вот почему все ваши существующие сюжеты исчезли. Попробуйте удалить его:

contourf(time,f,power,levels)
colormap(jet(levels))
set(gca,'XTickLabelMode','manual')
set(gca, 'XTick', 0:23);
set(gca, 'XTickLabel', {'0';'1';'23'});
xlabel('Time (UT)')
ylabel('Frequency (Hz)')
caxis([0,8])

Теперь возникает вопрос: разумно ли расставлены ваши галочки для данных, которые вы представляете? Не зная данных, я не могу вам ответить. Так что мяч теперь на вашей стороне. ;)

person JoErNanO    schedule 04.11.2014

Вы можете использовать массивы ячеек для определения ticks и tick-labels, а затем использовать их с вызовом функции set, чтобы сделать его более элегантным -

xtick_label_cellarr = num2cell(0:24)
xtick_cellarr = linspace(0,85680,numel(xtick_label_cellarr))

set(gca, 'XTick',xtick_cellarr)
set(gca, 'XTickLabel',xtick_label_cellarr)
person Divakar    schedule 04.11.2014
comment
Спасибо за предложение - но оно не сработало. Насколько я знаю, то, что у меня было раньше, было эквивалентно этому. - person Yoshi; 04.11.2014
comment
@Yoshi Можете ли вы поделиться скриншотами того, что вы получаете и что вы собираетесь получить? - person Divakar; 04.11.2014
comment
@Yoshi Основываясь на вашем опубликованном решении, я думаю, он предложил способ сделать его немного более общим. - person Divakar; 04.11.2014