Слишком много линий сетки в журнале

Когда я добавляю линии сетки в график журнала, кажется, что автоматически добавляются все возможные линии сетки, и я хотел бы включить только основные линии. Я попробовал отключить второстепенные галочки, но это не дало никакого эффекта.

Например:

loglog([0.000001,0.1],[0.000001,0.1])
grid on
gca.YAxis.MinorTick = 'off'

Как я могу просто иметь линии сетки на отмеченных метках осей?

Согласно документации по сетке простой вызов grid должен устанавливать только основные галочки. Добавление grid minor должно добавить второстепенные галочки. Это может быть ошибкой (пожалуйста, добавьте свою версию MATLAB в сообщение), поскольку «второстепенные» линии сетки действительно пунктирны, как если бы они были второстепенными, а не основными линиями сетки. Вы можете попробовать gca.YAxis.MinorTickAlpha = 0, сделав их полностью прозрачными. Если и это не сработает, эти линии действительно каким-то образом считаются «основными» линиями сетки, несмотря на то, что они пунктирные.

Adriaan 28.06.2024 08:26

Хорошо, моя версия Matlab — R2020b. gca.YAxis.MinorTickAlpha = 0 не сработало, и я подозреваю, что они считаются серьезными.

Matt Majic 28.06.2024 08:31

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

Adriaan 28.06.2024 08:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
3
96
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Сетки следуют за галочками, поэтому

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.

Matt Majic 28.06.2024 08:34

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')

X Zhang 28.06.2024 08:39

@MattMajic Если вы опустите «сетку включена», сетка не будет видна, верно? Можете ли вы попробовать другой обходной путь, описанный в предыдущем комментарии?

X Zhang 28.06.2024 08:40

Поскольку я обновил версию до 2020b, обновление 8, оба обходных пути работают. Но мне все же хотелось бы более автоматического подхода, если это возможно.

Matt Majic 28.06.2024 09:05
Ответ принят как подходящий

График 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, описанному в его документации, это, по моему мнению, ошибка.

Adriaan 28.06.2024 11:23

Поскольку невозможно вызвать grid, явно отключив второстепенные линии сетки: разве не это делает grid on, grid minor?

Luis Mendo 28.06.2024 15:48

@Луис, самое интересное в этих линиях сетки то, что grid on, grid minor не работает для отключения второстепенных линий сетки, как и grid on; grid minor (функционально эквивалентно здесь, по сути, две команды в одной). Однако отдельные вызовы grid on и grid minor работают. Я подозреваю, что ему необходимо очистить графический буфер, прежде чем он сможет отключить второстепенные линии сетки с помощью grid, потому что grid on, drawnow, grid minor действительно работает. Отредактировал мой ответ, чтобы отразить это

Wolfie 28.06.2024 17:21

@Wolfie Ах, я понимаю. Хорошее изменение в вашем ответе; жаль, что я не могу снова проголосовать :-)

Luis Mendo 28.06.2024 17:46

Спасибо, и grid on; drawnow(); grid minor, и set(gca,'xminorgrid','off','yminorgrid','off','xgrid','on','‌​ygrid','on') работают.

Matt Majic 30.06.2024 03:29

Другие ответы предоставляют решения, но не объясняют, почему ваш код не работает. Для ясности следует прежде всего отметить, что

  • функция 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';

делает то, что ты хочешь.

«Вы не можете напрямую применить точечную индексацию к выводу функции». С недавнего времени вы можете это сделать. Не помню точно, когда это было введено, несколько лет назад.

Cris Luengo 28.06.2024 16:24

О, видимо, для этого вам нужно добавить скобки: gca().YMinorGrid = 'off'. mathworks.com/help/matlab/matlab_prog/…

Cris Luengo 28.06.2024 16:27
Представлено в R2019b.
Cris Luengo 28.06.2024 16:32

@CrisLuengo Да, хорошая находка!

Luis Mendo 28.06.2024 17:09

Другие вопросы по теме