GD :: Graph에 대한 데이터 (x, y) 좌표로 데이터를 재정렬하려면 어떻게해야합니까?
문제
사용자로부터 입력 파일을 취하는 프로그램을 작성하고 있습니다. 파일에는 숫자가 많고 파일의 숫자를 읽고 사용하는 숫자를 기반으로 플롯을 작성합니다. GD :: 그래프.
파일의 첫 번째 줄은 x 축이고 파일의 두 번째 줄은 x 축에 해당하는 y 값과 예를 들어 다음과 같습니다.
1 2 3 4 5
2 4 5 10 14
5 6 8 12 13
위의 첫 번째 줄에서 첫 번째 줄은 x 축이고 두 번째는 xaxis에 해당하는 Y 값이므로 10 점을 가져옵니다. (1, 2) (1, 5) (2, 4) (2, 6) .... (4,10) (4,12) (5,14) (5, 13)
배열의 각 줄을 읽은 다음 공백이나 탭에서 선을 분할하고 값을 배열에 저장할 계획입니다. 따라서 배열 1은 x 축을 갖고 Array2는 y 축을 갖지만, 배열에 3, 4, 5, ... 등을 어떻게 저장해야합니까?
또한 첫 번째 및 두 번째 선 (2 배열)에 가장 큰 값을 찾으려면 x 및 y 축에 대한 한계를 만들 수 있습니까?
해결책
Whoops, 질문을 잘못 읽으십시오. 첫 번째 라인이 라인을 나타내는 지 또는 각각으로 표시 될 지점이 있는지 여부에 따라 AOAOH 또는 AOH를 원합니다. 파일의 각 줄이 그래프의 줄이되면 다음은 다음과 같습니다.
#!/usr/bin/perl
use strict;
use warnings;
use List::Util qw/min max/;
my @x_points = split " ", scalar <>; #read in the x axis labels
my ($x_min, $x_max) = (sort { $a <=> $b } @x_points)[0,-1];
my ($y_min, $y_max) = (0, 0);
#lines is an AoAoH, first layer are the lines to be drawn
#second layer is a list of coords
#third layer are the x and y coords
my @lines;
while (<>) {
my @y_points = split;
#if the two arrays are not the same size, we have a problem
die "invalid file\n" unless @y_points == @x_points;
$y_min = max($y_min, @y_points);
$y_max = min($y_max, @y_points);
push @lines, [
map { { x => $x_points[$_], y => $y_points[$_] } }
0 .. $#x_points
];
}
use Data::Dumper;
print "x min and max $x_min $x_max\n",
"y min and max $y_min $y_max\n",
"data:\n",
Dumper(\@lines);
my $i;
for my $line (@lines) {
$i++;
print "line $i is made up of points: ",
(map { "($_->{x}, $_->{y}) " } @$line), "\n";
}
그리고 여기에 내가 그릴 지점이라면 어떻게 처리 할 것인가가 있습니다.
#!/usr/bin/perl
use strict;
use warnings;
use List::Util qw/min max/;
my @x_points = split " ", scalar <>; #read in the x axis labels
my ($x_min, $x_max) = (sort { $a <=> $b } @x_points)[0,-1];
my ($y_min, $y_max) = (0, 0);
#lines is an AoAoH, first layer are the lines to be drawn
#second layer is a list of coords
#third layer are the x and y coords
my @points;
while (<>) {
my @y_points = split;
#if the two arrays are not the same size, we have a problem
die "invalid file\n" unless @y_points == @x_points;
$y_min = max($y_min, @y_points);
$y_max = min($y_max, @y_points);
push @points,
map { { x => $x_points[$_], y => $y_points[$_] } }
0 .. $#x_points;
}
use Data::Dumper;
print "x min and max $x_min $x_max\n",
"y min and max $y_min $y_max\n",
"data:\n",
Dumper(\@points);
print "Here are the points: ",
(map { "($_->{x}, $_->{y}) " } @points), "\n";
다른 팁
당신의 질문에 대한 답은 아니지만 놓치지 마세요 GD :: 그래프 :: 데이터.
당신이 아니라면 확실한 각 라인의 첫 번째와 마지막은 가장 작고 가장 큰 것과 같은 것을 사용해야합니다. 목록 :: util'에스 min()
그리고 max()
.
"파일의 첫 번째 줄은 x 축입니다. 파일의 두 번째 줄은 y 축이고 세 번째, 네 번째, ... 등은 x 축에 해당하는 점입니다."
갈 때 X와 Y 배열을 늘릴 수 있습니다.
#!/usr/bin/perl
use Data::Dumper;
use warnings;
use strict;
my @xs = ();
my @ys = ();
my $expecting_xs = 1;
my $last_xs_count;
while(<>) {
chomp;
my @values = split(/\s+/);
if($expecting_xs) {
push(@xs, @values);
$last_xs_count = @values;
$expecting_xs = 0;
} else {
if(@values != $last_xs_count) {
die "Count mismatch";
}
push(@ys, @values);
$expecting_xs = 1;
}
}
if(!$expecting_xs) {
die("Odd number of lines");
}
my($xmin, $xmax) = extremes(@xs);
my($ymin, $ymax) = extremes(@ys);
print "xmin: $xmin xmax: $xmax ymin: $ymin ymax: $ymax\n";
print Dumper(\@xs), Dumper(\@ys);
sub extremes {
my(@values) = @_;
return undef unless @values;
my $min = shift(@values);
my $max = $min;
for my $value (@values) {
$max = $value if $value > $max;
$min = $value if $value < $min;
}
return $min, $max;
}