2016-05-19 4 views
0

3 XY наборов данных для построения:Perl PDL -> GnuPlot -> AutoScale => 95% WhiteSpace?

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. Во всем диапазоне 20 единиц Y только [0 .. 1] имеет любые данные, поэтому 95% - пустое место.

IDEAL «Авто» масштабирование: масштабирование «стандартного отклонения», при котором несколько «отдаленных» точек данных будут сдвинуты с графика, чтобы лучше показать основную часть данных.

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

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

Есть ли какой-либо способ получить РАЗУМНЫЙ-ШКАЛ, отличный от max/min или порядка AUTOSCALE?

#!/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 

AutoScale with 5% Data

ответ

1

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

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

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

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

Что касается Вашего второго вопроса (идеального автомасштабирования, который учитывает дисперсию в ваших данных и не сюжет экстремальных выбросов), это звучит, как вы просите компьютер делать то, что вы имели в виду , вместо что вы на самом деле говорите ему. Gnuplot, как и большинство графических программ, по умолчанию будет отображать все данные. Если это не подходит, вам следует указать соответствующие диапазоны осей. Вы также можете посмотреть Using gnuplot, how to 'cut out' usused y-axis regions of the graph, как создать сломанную ось.

Смежные вопросы