Как построить и отобразить квадрат в Октаве? - PullRequest
2 голосов
/ 10 сентября 2011

Я не могу достичь, чтобы построить квадрат в Октаве.Я не могу форсировать оси одинакового масштаба, поэтому вместо этого получаю прямоугольник:

enter image description here

Следующие испытания не работают:

x = [0, 1, 1, 0, 0]';
y = [0, 0, 1, 1, 0];
plot(x, y), axis equal, axis([-1,2, -1,2])
% figure('Position', [10,10,100,100]); %[startx,starty,width,height]
% plot(x, y)

Возможно, мне потребуетсяуказать фиксированный размер окна и одинаково масштабированные оси.Я был бы удовлетворен, когда первое такое окно показывало бы правильный квадрат.Роскошное решение сделало бы окно (или его содержимое) не изменяемым в интерактивном режиме.

Замечания:

  1. У меня октава 3.2.4 на Windows XP.
  2. Предложение в Stackoverflow не работает.

Ответы [ 2 ]

6 голосов
/ 12 сентября 2011

Я считаю, что это проблема с устройством вывода Gnuplot windows. Сравните это с устройством wxt:

Gnuplot 4.4.3, WinXP

# Gnuplot, wxWidgets terminal
set terminal wxt size 200,400
set size ratio -1        # set size square
plot x

# Gnuplot, Windows terminal
set terminal windows size 200,400
set size ratio -1        # set size square
plot x

gnuplot_wxWidgets_terminal gnuplot_Windows_terminal

Обратите внимание, что для "win-терминала" размер влияет на размер фигуры, включая строку заголовка окна и строку состояния, тогда как для "wx-терминала" он устанавливает только внутреннюю область рисования


Октава 3.4.2, WinXP

К сожалению, когда я попробовал это в Octave , это все равно было не то, что должно быть для обоих типов терминалов. На самом деле, проблема в том, что изменение размера с помощью set(gcf,'position',[..]) не имело никакого эффекта:

# Octave, backend=Gnuplot, terminal=wxt/windows
graphics_toolkit gnuplot     # backend gnuplot
setenv('GNUTERM','wx')       # wx/windows
figure, set(gcf,'position',[100 100 200 400])
plot(-10:10, -10:10, 'r'), legend('x')
axis([-10 10 -10 10])
axis equal                   # axis square

Поэтому мне пришлось вручную изменять размеры фигур с помощью мыши до указанного размера (200,400) (да, я фактически вытянул виртуальную линейку и измерил пиксели!). Наконец, вызовите команду refresh для повторного планирования:

octave_gnuplot_wx_resized octave_gnuplot_windows_resized

Хорошей новостью является то, что после правильной установки размера фигуры axis equal работает для обоих типов терминалов.

С другой стороны, новый бэкэнд FLTK работает правильно, без каких-либо взломов, поэтому вы можете переключиться на него:

# Octave, backend=FLTK
graphics_toolkit fltk        # backend fltk
figure, set(gcf,'position',[100 100 200 400])
plot(-10:10, -10:10, 'r'), legend('x')
axis([-10 10 -10 10])
axis equal

octave_fltk


MATLAB

Для справки вот вывод MATLAB:

%# MATLAB
figure, set(gcf,'position',[100 100 200 400])
plot(-10:10, -10:10, 'r'), legend('x')
axis equal
axis([-10 10 -10 10])

matlab

3 голосов
/ 10 сентября 2011

Это работает для меня (Octave на Linux):

x = [0, 1, 1, 0, 0]';
y = [0, 0, 1, 1, 0];
plot(x, y)
axis([-1,2, -1,2])
axis equal % or axis square

Однако, это работает только до тех пор, пока вы не измените размер окна рисунка, поэтому я признаю, что это немного суетливо. Итак, чтобы получить то, что вы хотите с Octave, я думаю, вам придется разместить окно с вашей фигурой и внести все изменения перед вызовом axis equal. Мне очень мало повезло с многократным вызовом axis equal.

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

редактировать : Для полноты заговора того, что производит мой код (если я воздерживаюсь от изменения размера окна рисунка)

enter image description here

Если у вас ничего не получается, вы можете попробовать отладить код Octave, который вы вызываете. В MATLAB вы можете проверить соответствующий код, набрав edit axis, но в Octave, я думаю, вы должны указать полный путь к файлу axis.m (который упоминается в help axis).

...