كيف يمكنني إعادة ترتيب بياناتي لتكون (x، y) إحداثيات GD :: الرسم البياني؟

StackOverflow https://stackoverflow.com/questions/714494

  •  23-08-2019
  •  | 
  •  

سؤال

أكتب برنامجا يأخذ في ملف الإدخال من المستخدم. يحتوي الملف على مجموعة من الأرقام الموجودة فيه وسأقرأ الأرقام في الملف وإنشاء مؤامرة بناء على تلك الأرقام باستخدام GD :: الرسم البياني.

الخط الأول من الملف هو المحور x، والسطر الثاني من الملف هو القيم Y المقابلة المحور X والثالث والرابع ...، إلخ على سبيل المثال:

1 2 3 4 5 
2 4 5 10 14
5 6 8 12 13

لذلك في أعلاه، السطر الأول هو المحور العاشر، والثاني هو القيم Y المقابلة Xaxis لذلك سيجلب هذا 10 نقاط. (1، 2) (1، 5) (2، 4) (2، 6) .... (4،10) (4،12) (5،14) (5، 13)

أخطط لقراءة كل سطر من الصفيف ثم تقسيم الخط على المسافات أو علامات التبويب وتخزين القيم في صفيف. لذلك، سيكون للمصفاة 1 محورا X، وسيكون لدى Array2 محورا، ولكن كيف يمكنني تخزين 3، 4، الخامس، ...، الخطوط، إلخ في صفيف حتى تصبح (س، ص)؟

علاوة على ذلك، كيف يمكنني العثور على أكبر قيمة للخطوط الأولى والثانية (صفيف 2) حتى أتمكن من إنشاء حد لمحقي X و Y؟

هل كانت مفيدة؟

المحلول

يصطادوا سؤالهم، كما تريد إما 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 :: الرسم البياني :: Data.

إلا إذا كنت بالتأكيد أن الأول والأخير في كل سطر هو أصغر / أكبر ستحتاج إلى استخدام شيء مثل القائمة :: eltilmin() و 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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top