Como configuro a estrutura de dados para fazer gráficos de pizza em GD::Graph?

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

  •  21-09-2019
  •  | 
  •  

Pergunta

Estou escrevendo um script Perl para criar um gráfico de pizza usando GD::Gráfico::torta com estas matrizes:

@Array1 = ("A", "B", "C", "D");
$array2 = [
      ['upto 100 values'],
      ['upto 100 values'],
      ['upto 100 values'],
      ['upto 100 values']
    ];

De acordo com meu entendimento, para fazer isso, tenho que criar um array com as referências dos arrays acima, como:

 my @graph_data = (\@Array1, @$array2);

Eu também tentei usar foreach loop, mas não obtendo bons resultados.Quero criar um gráfico de pizza com o primeiro valor em @Array1 contra o primeiro valor em $array2 e segundo valor em @Array1 contra o segundo valor em $array2 e assim por diante.Também quero colocar o mesmo título para cada gráfico de acordo com os valores em @Array1.

eg.
my @graph_data1 = (\@Array1[0], @$array2[0]);

Alguém pode me sugerir a melhor maneira de fazer isso?

Foi útil?

Solução 4

Encontrei a solução deste problema usando o código abaixo.

my @pairs = map{"$Array1[$_]@$array2[$_],"} 0..$#Array1;

Depois disso, os valores do array @pairs podem ser usados ​​para criar gráficos.

Outras dicas

Antes de entrar em gráficos de pizza e coisas assim, sugiro que você se atualize sobre estruturas e referências básicas de dados Perl. Por favor leia Perlreftut, você deve ser capaz de resolver esse problema depois.

Não tenho certeza se entendi o que você está tentando fazer, mas este exemplo produzirá 3 gráficos de pizza, todos eles usando o mesmo conjunto de categorias. Eu faria o segundo conselho de Manni: passar algum tempo com Perlreftut e Perldsc. Além disso, se você baixar o GD :: Gráfico módulo, ele fornece muitos exemplos, incluindo gráficos de pizza (veja o samples subdiretório).

use strict;
use warnings;
use GD::Graph::pie;

my @categories = qw(foo bar fubb buzz);
my @data = ( 
    [   25,    32,    10,     44 ],  # Data values for chart #1
    [  123,   221,   110,    142 ],  # Data values for chart #2
    [  225,   252,   217,    264 ],  # etc.
);

for my $i (0 .. $#data){
    my $chart = GD::Graph::pie->new;
    my @pie_data = ( \@categories, $data[$i] );
    $chart->plot(\@pie_data);

    open(my $fh, '>', "pie_chart_$i.gif") or die $!;
    binmode $fh;
    print $fh $chart->gd->gif;
    close $fh;
}

Para declarar em inglês mais claro, o que as outras respostas dizem menos diretamente:

my @graph_data = (\Array1, $@array2);
my @graph_data1 = (\Array1[0], $@array2[0]);

Parece louco. Você quase certamente significa:

my @graph_data = (\@Array1, $array2);
# you want the first element of each list in the same datastructure?
my @graph_data1 = ([$Array1[0]], [$array2->[0]]); # (['A'], [[..numbers..]])
                                                  # Note *two* [ and ] in 2nd bit
# ... or you want a different datastructure?
my @graph_data1 = ($Array1[0], $array2->[0]); # ('A', [..numbers..]) 

@Array1 é uma matriz, você deseja uma referência a ele, e isso seria @Array1.

$ ARRAY2 já é uma referência a uma matriz. Ele contém referências a matrizes e presumo que você queira uma lista que contenha a referência à matriz no índice 0. Assim: $ Array2-> [0] é o primeiro elemento indexado por meio de uma referência de matriz e já é uma referência de matriz.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top