Вопрос:
Когда я рисую функцию f (x) в Matlab, например, синусоидальную функцию, я получаю следующий:
Я хочу построить его по-другому, например, с помощью Mathematica:
Обратите внимание на положение осей (вместе с тиками) и положение ярлыков x и y.
Любая помощь будет очень оценена.
Лучший ответ:
Потому что не у всех читателей есть последняя версия MATLAB, я решил сделать этот ответ немного более общим, так что теперь это функция, которая получает в качестве входного указателя фигуру для манипулирования и устанавливает ее начало в центр:
function AxesOrigin(figureh) % set the origin of a 2-D plot to the center of the axes figureh.Color = [1 1 1]; % get the original properties: del_props = {‘Clipping’,’AlignVertexCenters’,’UIContextMenu’,’BusyAction’,… ‘BeingDeleted’,’Interruptible’,’CreateFcn’,’DeleteFcn’,’ButtonDownFcn’,… ‘Type’,’Tag’,’Selected’,’SelectionHighlight’,’HitTest’,’PickableParts’,… ‘Annotation’,’Children’,’Parent’,’Visible’,’HandleVisibility’,’XDataMode’,… ‘XDataSource’,’YDataSource’,’ZData’,’ZDataSource’}; lineprop = figureh.CurrentAxes.Children.get; lineprop = rmfield(lineprop,del_props); x = lineprop.XData; y = lineprop.YData; old_XTick = figureh.CurrentAxes.XTick; old_YTick = figureh.CurrentAxes.YTick; old_Xlim = figureh.CurrentAxes.XLim; old_Ylim = figureh.CurrentAxes.YLim; % check that the origin in within the data points assert(min(x)<0 && max(x)>0 && min(y)<0 && max(y)>0,’The data do not cross the origin’) figureh.CurrentAxes.Children.delete axis off % Create Q1 axes axes(‘Parent’,figureh,… ‘Position’,[0.5 0.5 0.4 0.4],… ‘XTick’,old_XTick(old_XTick>0),… ‘YTick’,old_YTick(old_YTick>0)); xlim([0 max(old_XTick)]); ylim([0 max(old_YTick)]); % Create Q3 axes axes1 = axes(‘Parent’,figureh,… ‘YAxisLocation’,’right’,… ‘XAxisLocation’,’top’,… ‘Position’,[0.1 0.1 0.4 0.4],… ‘XTick’,old_XTick(old_XTick<0),… ‘YTick’,old_YTick(old_YTick<0)); xlim(axes1,[min(old_XTick) 0]); ylim(axes1,[min(old_YTick) 0]); % Create real axes axes2 = axes(‘Parent’,figureh,… ‘Position’,[0.1 0.1 0.8 0.8]); hold(axes2,’on’); axis off plot(x,y,’Parent’,axes2) set(axes2.Children,lineprop) xlim(axes2,old_Xlim); ylim(axes2,old_Ylim); end
Он удаляет исходные оси и ставит два других, чтобы создать представление типа “origin-like”. Он не идеален и больше похож на базовую идею обходного пути, которую следует настроить под конкретную цель, но это может быть хорошим местом для начала, если вы используете 2015a или ранее.
Демонстрация:
x=-2*pi:0.1:2*pi; h = figure(); plot(x,sin(x),’:or’);
Этот код создает этот вывод:
и после использования функции выше:
AxesOrigin(h)
получаем результат:
Ответ №1
Начиная с MATLAB 2015b (в соответствии с примечаниями к выпуску) вы можете использовать опцию ‘origin’ для XAxisLocation и YAxisLocation имущество. Поэтому добавьте это в свой код:
ax = gca; % gets the current axes ax.XAxisLocation = ‘origin’; % sets them to zero ax.YAxisLocation = ‘origin’; % sets them to zero ax.Box = ‘off’; % switches off the surrounding box ax.XTick = [-3 -2 -1 0 1 2 3]; % sets the tick marks ax.YTick = [-1 -0.5 0 0.5 1]; % sets the tick marks
Источник
Ответ №2
Это работает для меня:
ha = gca; ha.XAxisLocation = ‘origin’; ha.YAxisLocation = ‘origin’;
Основываясь на странице справки “Отображать оси оси через начало” .