Продолжение обсуждения DISLIN как решения, с ответом, который не вписывается в комментарий ...
@ M. С. Б. - привет. Я прошу прощения за запись в вашем ответе, но эти комментарии слишком короткие, и ответить на вопрос в форме ответа с ответом ... в любом случае ...
В DISLIN есть функция Quick Plot - подпрограмме QPLOT требуется только три аргумента для построения кривой: массив X, массив Y и число N. См. Главу 16 руководства. Плюс всего несколько дополнительных звонков для выбора устройства вывода и маркировки осей. Я этим не пользовался, поэтому не знаю, насколько хорош автоматическое масштабирование.
Да, я знаю Quickplot и связанные с ним подпрограммы, но он слишком фиксирован для моих нужд (ничего не может изменить), и да, его автоматическое масштабирование несколько странно. Кроме того, слишком большие поля внутри графа.
Или, если вы хотите использовать возможности GRAF для настройки графического блока, есть подпрограмма GAXPAR для автоматического создания рекомендуемых значений. -2 в качестве первого аргумента LABDIG автоматически определяет количество цифр в метках галочки.
Вы пробовали процедуры?
Извините, я не могу найти процедуру GAXPAR, на которую вы ссылаетесь, в индексе Дислина. Вы уверены, что он называется именно так?
Ответ М.С.Б. : Да, я уверен в написании GAXPAR. Это последняя процедура в главе 4 руководства пользователя DISLIN 9.5 PDF. Возможно, это новая рутина? Также существует другой путь к автоматическому масштабированию: SETSCL - см. Главу 6.
Пока что я занимаюсь (кроме некоторых решений "утиной лентой")
use dislin; implicit none
real, dimension(5) :: &
x = [.5, 2., 3., 4., 5.], &
y = [10., 22., 34., 43., 15.]
real :: xa, xe, xor, xstp, &
ya, ye, yor, ystp
call setpag('da4p'); call metafl('xwin');
call disini(); call winkey('return');
call setscl(x,size(x),'x');
call setscl(y,size(y),'y')
call axslen(1680,2376) !(8/10)*2100 and 2970, respectively
call setgrf('name','name','line','line')
call incmrk(1); call hsymbl(3);
call graf(xa, xe, xor, xstp, ya, ye, yor, ystp); call curve(x,y,size(x))
call disfin()
end
, который поместит крайние значения прямо на ось. Знаете ли вы, возможно, как я мог бы получить один «основной тиковый запас» снаружи, чтобы поместить некоторую область между кривой и осью (при этом все еще сохраняя эффекты setscl)?
Даже если вам не нравится встроенное автоматическое масштабирование, если вы уже используете DISLIN, выполнить собственное автоматическое масштабирование будет проще, чем вызывать Fortran из MATLAB. Вы можете использовать встроенные функции Fortran minval и maxval, чтобы найти наименьшее и наибольшее значения в данных, а затем написать подпрограмму для округления в сторону «хороших» значений округления. Точно так же подпрограмма, чтобы выбрать интервал между отметками.
Это на самом деле не так легко осуществить (и идеи, которые докажут меня неправильно, будут с благодарностью оценены). Или я должен сказать, что это легко, если вы знаете приблизительный диапазон, в котором будут лежать ваши значения. Но если вы этого не сделаете, и вы не знаете,
будут ли ваши значения лежать в диапазоне 13-34 или 1330-3440, тогда ...
... если я здесь совершенно не на том пути, пожалуйста, объясните, если вы что-то другое. Моему английскому немного не хватает, так что я могу только надеяться, что вышеизложенное понятно.
Внутри подпрограммы для определения начальных / конечных значений круглого графика вы можете масштабировать фактические минимальные / максимальные значения всегда между 1 и 10, затем иметь таблицу для выбора хороших круглых значений, а затем масштабировать обратно до правильного диапазона.
-