Perl PDL -> GnuPlot -> AutoScale => 95% WhiteSpace?

3 набора данных XY для построения:

A) Function plot XY
B) Polynomial, shares X with function, Y is poly_eval(x)
C) Polynomial_error;  X, Y=poly(x) - fct(x)
Range X:  ]0.0 .. 1.0[  (full range 0->1 plus some extra, both sides
Range Y:  ]0.0 .. 1.0[

Требуются: все 3 набора данных XY для построения графика автоматически масштабируются, как если бы это был ЕДИНСТВЕННЫЙ набор данных. Ожидайте: "Маленький", пробел выше / ниже
Данные об ошибках охватывают весь диапазон Y, а не диапазон ~0 вблизи Y=0

Результат: Диапазон Y [-10 .. 10]
Линия ошибки - это плоская линия в середине графика с содержанием ~0. Во всем диапазоне Y из 20 единиц только данные имеют [0 .. 1], поэтому 95% - это пустое пространство.

ИДЕАЛЬНОЕ "Автоматическое" масштабирование: Поддержка масштабирования "стандартное отклонение", при котором несколько "удаленных" точек данных будут отталкиваться от графика, чтобы лучше отображать объем данных.

Показательный пример: ошибка XY данных. В крайних случаях значения погрешности Y являются гигантскими по сравнению со средним значением - около 14 сигм. Автоматическое масштабирование сдавливает 98% данных с точностью до пикселя от нуля.

Если я вычислю стандартное отклонение и вручную установлю yrange=>[$ylo, $yhi] что-то вроде среднего +- 1 сигма, это выглядит информативно.

Есть ли какой-нибудь способ получить РАЗУМНО-МАСШТАБНОЕ, кроме макс / мин или порядка величины АВТОСКАЛ?

#!/usr/local/bin/perl -w

use PDL::IO::Misc;
use PDL::Graphics::Gnuplot;
use PDL::Fit::Polynomial;
use PDL::Core;
use List::Util qw(max min);

for($mi=0; $mi < scalar @mxa; $mi++)  {
    @xara = @{$mxa[$mi]};  # @MXA => Array of @xara 
    @yara = @{$mya[$mi]};  # @MYA => Array of @yara 
    $px   = pdl(\@xara);  
    $py   = pdl(\@yara);
    if($mi > 0)  {
        $pw->replot(with=>"lines", linewidth=>5, $px, $py);  # autoscale=>'', 
        next;  
    }
    # Use autoscale=>'' to "set [autoscale] all the axes at once" 
    $pw=gpwin("png", output=>"$imgfn", size=>[$pxres,$pyres,'px'],font=>"=11");
    $pw->plot(title=>"$title", xrange=>[$xlo, $xhi], xlab=>"$xlbl", 
        ylab=>["$ylbl", "offset 1"], autoscale=>'', 
        with=>"lines", linewidth=>5, linetype=>2, linestyle=>1, $px, $py);
}  # End For MI

Автоматическое масштабирование с данными 5

1 ответ

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

Мой вопрос к вам, почему использование autoscale=>''?. В документации для опции автоматического масштабирования PDL::Graphics::Gnuplot указано, что "по умолчанию все оси автоматически масштабируются, если вы не зададите диапазон на этой оси...". Поэтому я могу создать что-то вроде того, что, я думаю, вы хотите, оставив автомасштабирование по умолчанию:

$px=xvals(101)/100;
$py=0.96*sqrt($x)+.02;
$pw->plot(with=>'lines',$px,$py);

Это приведет к $py заполнить почти все окно графика, с небольшим количеством буфера сверху и снизу.

Что касается вашего второго вопроса (идеальное автоматическое масштабирование, которое учитывает отклонения в ваших данных и не отображает экстремальные выбросы), звучит так, будто вы просите компьютер сделать то, что вы имеете в виду, вместо того, что вы на самом деле говорите это делать. Gnuplot, как и большинство программ для построения графиков, будет отображать все данные по умолчанию. Если это не подходит, вы должны указать соответствующие диапазоны осей. Вы также можете посмотреть на Использование gnuplot, как "вырезать" используемые области графика по оси Y для создания ломаной оси.

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