Como configuro a estrutura de dados para fazer gráficos de pizza em GD::Graph?
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?
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.