Когда я добавляю линии сетки в график журнала, кажется, что автоматически добавляются все возможные линии сетки, и я хотел бы включить только основные линии. Я попробовал отключить второстепенные галочки, но это не дало никакого эффекта.
Например:
loglog([0.000001,0.1],[0.000001,0.1])
grid on
gca.YAxis.MinorTick = 'off'
Как я могу просто иметь линии сетки на отмеченных метках осей?
Хорошо, моя версия Matlab — R2020b. gca.YAxis.MinorTickAlpha = 0
не сработало, и я подозреваю, что они считаются серьезными.
Самое странное, на мой взгляд, заключается в том, что все, кажется, предполагает, что эти линии действительно считаются «основными», несмотря на то, что ваши настоящие основные линии представляют собой непрерывные черные линии сетки (как и следовало ожидать от основных линий), тогда как остальные пунктирные, как если бы они были незначительными.
Сетки следуют за галочками, поэтому
loglog([0.000001,0.1],[0.000001,0.1])
grid on
set(gca(),'XTick',logspace(-6,-1,6),'YTick',logspace(-6,-1,6),'XMinorGrid','off','YMinorGrid','off')
дать тебе
Этот код создает тот же график, что и раньше — возможно, это ошибка, поскольку моя версия — 2020b.
loglog([0.000001,0.1],[0.000001,0.1]) set(gca(),'XTick',logspace(-6,-1,6),'YTick',logspace(-6,-1,6) ,'XMinorGrid','off','YMinorGrid','off','XGrid','on','YGrid','on')
@MattMajic Если вы опустите «сетку включена», сетка не будет видна, верно? Можете ли вы попробовать другой обходной путь, описанный в предыдущем комментарии?
Поскольку я обновил версию до 2020b, обновление 8, оба обходных пути работают. Но мне все же хотелось бы более автоматического подхода, если это возможно.
График loglog
имеет необычные оси, поскольку второстепенные деления включены по умолчанию, как и следовало ожидать от основных делений. Итак, это поведение из документации grid
— это что-то вроде серой зоны:
grid on
отображает основные линии сетки для текущих осей, возвращаемых командой gca. Основные линии сетки проходят от каждой отметки.
Обратите внимание, что большинство графиков в документации для loglog используют grid on
и показывают второстепенные (почти) сетки, как вы видите, поэтому я сомневаюсь, что это неожиданное поведение с точки зрения MathWorks.
Поскольку нет возможности вызвать grid
при явном отключении второстепенных линий сетки (поскольку это должно быть поведением по умолчанию), вам придется более детально управлять сетками с помощью set
после создания осей. Вы можете включить основные сетки и отключить второстепенные сетки одной командой, вообще не используя grid()
...
Протестировано в обновлении 5 R2020b:
loglog([0.000001,0.1],[0.000001,0.1])
set(gca,'xminorgrid','off','yminorgrid','off','xgrid','on','ygrid','on')
Редактировать: Из разговора в комментариях Луис предположил, что grid on, grid minor
должно сработать. Однако при тестировании в R2020b его нет. Вызов этих команд двумя отдельными вызовами работает так же, как использование set
выше:
loglog([0.000001,0.1],[0.000001,0.1])
grid on
grid minor
Я предполагаю, что графический буфер должен быть очищен до того, как grid minor
сработает для удаления линий сетки, возможно, потому, что в противном случае удалять нечего. Вы можете замаскировать это как одну строку, используя drawnow
для очистки буфера, но в этот момент я бы рекомендовал просто использовать set
, как показано выше.
loglog([0.000001,0.1],[0.000001,0.1])
grid on; drawnow(); grid minor
Порассуждая, может быть, автор loglog
решил, что второстепенные сетки с переменным интервалом сделают сюжет более «логичным»? то есть это более очевидно нелинейный масштаб.
Ваша заметка имела бы смысл. Однако это должно быть четко задокументировано, и, поскольку это противоречит обычному поведению grid
, описанному в его документации, это, по моему мнению, ошибка.
Поскольку невозможно вызвать grid
, явно отключив второстепенные линии сетки: разве не это делает grid on, grid minor
?
@Луис, самое интересное в этих линиях сетки то, что grid on, grid minor
не работает для отключения второстепенных линий сетки, как и grid on; grid minor
(функционально эквивалентно здесь, по сути, две команды в одной). Однако отдельные вызовы grid on
и grid minor
работают. Я подозреваю, что ему необходимо очистить графический буфер, прежде чем он сможет отключить второстепенные линии сетки с помощью grid
, потому что grid on, drawnow, grid minor
действительно работает. Отредактировал мой ответ, чтобы отразить это
@Wolfie Ах, я понимаю. Хорошее изменение в вашем ответе; жаль, что я не могу снова проголосовать :-)
Спасибо, и grid on; drawnow(); grid minor
, и set(gca,'xminorgrid','off','yminorgrid','off','xgrid','on','ygrid','on')
работают.
Другие ответы предоставляют решения, но не объясняют, почему ваш код не работает. Для ясности следует прежде всего отметить, что
gca
дает текущий объект осей;YAxis
последнего относится к объекту числовой линейки, который является дочерним элементом осей.С вашим кодом есть две проблемы. Первая проблема в том, что
gca.YAxis.MinorTick = 'off'
не задает свойство числовой линейки внутри текущих осей. Вы не можете напрямую применить точечную индексацию к выводу функции; вам нужно сделать одно из следующих действий:
сначала присвойте его переменной:
a = gca;
a.YAxis.MinorTick = 'off';
используйте круглые скобки (спасибо, @CrisLuengo!)
gca().YAxis.MinorTick = 'off';
используйте get
и set
(более громоздко):
set(get(gca, 'YAxis'), 'MinorTick', 'off')
Ваш код создает структуру с именем gca
(таким образом затеняя функцию с тем же именем) с указанным полем, подполем и значением. Не полезно.
Вторая проблема заключается в том, что свойство MinorTick
числовой линейки влияет только на второстепенные деления, а не на второстепенные линии сетки. То, что вы хотите установить, — это свойство YMinorGrid
текущих осей. Так,
a = gca;
a.YMinorGrid = 'off';
делает то, что ты хочешь.
«Вы не можете напрямую применить точечную индексацию к выводу функции». С недавнего времени вы можете это сделать. Не помню точно, когда это было введено, несколько лет назад.
О, видимо, для этого вам нужно добавить скобки: gca().YMinorGrid = 'off'
. mathworks.com/help/matlab/matlab_prog/…
@CrisLuengo Да, хорошая находка!
Согласно документации по сетке простой вызов
grid
должен устанавливать только основные галочки. Добавлениеgrid minor
должно добавить второстепенные галочки. Это может быть ошибкой (пожалуйста, добавьте свою версию MATLAB в сообщение), поскольку «второстепенные» линии сетки действительно пунктирны, как если бы они были второстепенными, а не основными линиями сетки. Вы можете попробоватьgca.YAxis.MinorTickAlpha = 0
, сделав их полностью прозрачными. Если и это не сработает, эти линии действительно каким-то образом считаются «основными» линиями сетки, несмотря на то, что они пунктирные.