Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

XLSX::Chart legend question

by smh (Acolyte)
on Mar 08, 2022 at 04:50 UTC ( [id://11141902]=perlquestion: print w/replies, xml ) Need Help??

smh has asked for the wisdom of the Perl Monks concerning the following question:

Hi, I have a long code that reads a bunch of large data files, does a lot math and then writes the results in a XLSX worksheet and generates charts from the saved data. Everything works fin except for the chart legend. Below are my three problems. 1- The legend does NOT show when EXCEL page is opened. I have to go to the generated spreadsheet and select the option to show the legend 2- I have not been able to change font and the font size. the code the CPAN page in the "set_legend()" section does not do what the manual claims. 3- I have not seen any reference to how would one change the font and it size. I am using "Excel::Writer::XLSX-1.09" from CPAN Any help and guidance is greatly appropriated. -smh

Replies are listed 'Best First'.
Re: XLSX::Chart legend question
by swl (Parson) on Mar 08, 2022 at 08:40 UTC

    Can you reduce the problem to an SSCCE? That will increase the chances of people being able to help if they have not tried this exact process before.

      Below is the section of eth code that writes the worksheet and adds the chart.

      my $workbook = Excel::Writer::XLSX->new( 'chart.xlsx' ); my $worksheet = $workbook->add_worksheet(); my $bold = $workbook->add_format( bold => 1 ); # Add the worksheet data that the charts will refer to. #my $headings = [ @H ] #my $data = [ @D ]; my $h = <CSV>; chomp( $h); my @H = split( ',', $h ); $worksheet->write( 0,0, \@H, $bold ); # write_row() my $i = 1; while( <CSV> ) { chomp; my @B = split( ',', $_ ); $worksheet->write( $i++, 0, \@B ); # write_row() } close( CSV ); # Create a new chart object. In this case an embedded chart. my $chart = $workbook->add_chart( type => 'scatter', subtype => 'stacked', embedded => 1 ); $chart->set_size( width => 1020, height => 720 ); $chart->set_title ( name => 'NEXT: Near End Crosstalk', name_font => { name => 'Calibri', #'Arial', size => 22, bold => 1, #italic => 1, }, ); $chart->set_x_axis( name => 'Frequncy (Hz)', num_format => '#,##0', min => 10, max => 80000, crossing => 0, # position_axis => 'on_tick', log_base => 10, label_position => 'next_to', major_tick_mark => 'outside', minor_tick_mark => 'outside', major_gridlines => { visible => 1, line => { color => '#E0E0E0', width => 0.75, dash_type => 'solid' } }, minor_gridlines => { visible => 1, line => { color => '#E0E0E0', width => 0.75, dash_type => 'solid' } }, name_font => { name => 'Calibri', #'Arial', size => 14, bold => 1, #italic => 1, } ); $chart->set_y_axis( name => 'NEXT (DB)', num_format => '0E+00', #'###0', min => 0, max => 2e-4, # minor_unit => 0.4, # major_unit => 2, # interval_tick => 4, major_tick_mark => 'outside', minor_tick_mark => 'outside', major_gridlines => { visible => 1, line => { color => '#E0E0E0', width => 0.75, dash_type => 'solid' } }, minor_gridlines => { visible => 1, line => { color => '#E0E0E0', width => 0.75, dash_type => 'solid' } }, name_font => { name => 'Calibri', #'Arial', size => 14, bold => 1, } ); $chart->set_legend( position => 'overlay_top_right', #'top_right', fill => 'solidfill', ); #$chart->set_legend({ 'font'=> { 'bold' => 1, 'italic' => 1}}); <<== t +aken from CPAN example, it generates error # Configure the first series. $chart->add_series( name => '=Sheet1!$B$1', categories => '=Sheet1!$A$2:$A$6701', values => '=Sheet1!$B$2:$B$7701', line => { #color => 'red', width => 2.0 }, ); # Configure the first series. $chart->add_series( name => '=Sheet1!$C$1', categories => '=Sheet1!$A$2:$A$6701', values => '=Sheet1!$C$2:$C$7701', line => { #color => 'blue', width => 2.0 }, ); # Configure the first series. $chart->add_series( name => '=Sheet1!$D$1', categories => '=Sheet1!$A$2:$A$6701', values => '=Sheet1!$D$2:$D$7701', line => { #color => 'magenta', width => 2.0 }, ); # Configure the first series. $chart->add_series( name => '=Sheet1!$E$1', categories => '=Sheet1!$A$2:$A$6701', values => '=Sheet1!$E$2:$E$7701', line => { #color => 'cyan', width => 2.0 }, ); # Set an Excel chart style. Blue colors with white outline and shadow. $chart->set_style( 23 ); # Insert the chart into the worksheet (with an offset). $worksheet->insert_chart( 'G2', $chart , 0, 0 ); ## last twp #s are X +_offset, Y_offset $workbook->close();
        Your SSCCE was neither self-contained nor correct/compilable.

        To be able to help you, I added the use-modules at the top, plus I aliased the CSV bareword-filehandle to the built-in DATA bareword-filehandle, so that reading from <CSV> will actually read from the __DATA__ section at the end of the file:

        #!perl use 5.012; # strict, // use warnings; use Excel::Writer::XLSX; *CSV = *DATA; # makes CSV an alias to the __DATA__ section, so I can + add CSV data to the end of the script, rather than creating a separa +te file; you will not want this line in your application
        ... to the top. And then I created the __DATA__ section at the end of the script, with some CSV-style data:
        __DATA__ freq,b xtalk 10,0.000001 20,0.000002 50,0.000005 100,1.00E-05 200,2.00E-05 500,5.00E-05 1000,1.00E-04

        (I only did columns A:B; data in C:E wasn't necessary to prove that the legend and chart will work.)

        For your program, you won't need the *CSV = *DATA, nor the __DATA__ section at the end, because presumably you already opened CSV in some line of code not shown to us. (Read perldoc -f open, and learn to use lexical filehandles rather than the old-fashioned bareword filehandles. And don't forget to check for success on your open: it's easiest to do that automatically by using use autodie;)

        With the solidfill legend code in there, it gives me the warning

        Can't use string ("solidfill") as a HASH ref while "strict refs" in us +e at c:/usr/local/apps/berrybrew/perls/system/perl/site/lib/Excel/Wri +ter/XLSX/Chart.pm line 1158.
        and doesn't create the chart at all. If I comment that out, so none of the set_legend calls are active, I get a chart that I think matches your expectation (though the legend is on the center-right and isn't formatted).

        I don't know where you got fill=>'solidfill', as I don't see "solidfill" anywhere in the chart formatting section. I tried

        $chart->set_legend( position => 'overlay_top_right', fill => { color => 'red' }, );
        ... and it put it over the chart in the top right with a red background, which is what I'd expect.

        You claimed

        #$chart->set_legend({ 'font'=> { 'bold' => 1, 'italic' => 1}}); <<== t +aken from CPAN example, it generates error
        ... but the documentation actually says in the set_legend() section,
        $chart->set_legend( font => { bold => 1, italic => 1 } );
        ... Notice, it only has one pair of braces, not two like in your code. Using exactly the line that the POD shows, I get a legend on the far right whose labels are bold and italic.

        Combining it all together

        $chart->set_legend( position => 'overlay_top_right', fill => { color => 'red' }, font => { 'bold' => 1, 'italic' => 1}, );

        I get upper right, red background, bold and italic, exactly as I would expect.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://11141902]
Front-paged by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (4)
As of 2024-04-19 13:13 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found