app/Module/StatisticsChartModule.php
private function myPlot(
        string $chart_title,
        array $x_axis,
        string $x_axis_title,
        array $ydata,
        string $y_axis_title,
        array $z_axis,
        int $y_axis_type
    ): string {
        if (!count($ydata)) {
            return I18N::translate('This information is not available.');
        }

        // Colors for z-axis
        $colors = [];
        $index  = 0;
        while (count($colors) < count($ydata)) {
            $colors[] = self::Z_AXIS_COLORS[$index];
            $index    = ($index + 1) % count(self::Z_AXIS_COLORS);
        }

        // Convert our sparse dataset into a fixed-size array
        $tmp = [];
        foreach (array_keys($z_axis) as $z) {
            foreach (array_keys($x_axis) as $x) {
                $tmp[$z][$x] = $ydata[$z][$x] ?? 0;
            }
        }
        $ydata = $tmp;

        // Convert the chart data to percentage
        if ($y_axis_type === self::Y_AXIS_PERCENT) {
            // Normalise each (non-zero!) set of data to total 100%
            array_walk($ydata, static function (array &$x) {
                $sum = array_sum($x);
                if ($sum > 0) {
                    $x = array_map(static function ($y) use ($sum) {
                        return $y * 100.0 / $sum;
                    }, $x);
                }
            });
        }

        $data = [
            array_merge(
                [ I18N::translate('Century') ],
                array_values($z_axis)
            )
        ];

        $intermediate = [];
        foreach ($ydata as $century => $months) {
            foreach ($months as $month => $value) {
                $intermediate[$month][] = [
                    'v' => $value,
                    'f' => ($y_axis_type === self::Y_AXIS_PERCENT) ? sprintf('%.1f%%', $value) : $value,
                ];
            }
        }

        foreach ($intermediate as $key => $values) {
            $data[] = array_merge(
                [ $x_axis[$key] ],
                $values
            );
        }

        $chart_options = [
            'title' => '',
            'subtitle' => '',
            'height' => 400,
            'width'  => '100%',
            'legend' => [
                'position'  => count($z_axis) > 1 ? 'right' : 'none',
                'alignment' => 'center',
            ],
            'tooltip' => [
                'format' => '\'%\'',
            ],
            'vAxis' => [
                'title' => $y_axis_title ?? '',
            ],
            'hAxis' => [
                'title' => $x_axis_title ?? '',
            ],
            'colors' => $colors,
        ];

        return view(
            'statistics/other/charts/custom',
            [
                'data'          => $data,
                'chart_options' => $chart_options,
                'chart_title'   => $chart_title,
            ]
        );
    }
private function myPlot(
        string $chart_title,
        array $x_axis,
        string $x_axis_title,
        array $ydata,
        string $y_axis_title,
        array $z_axis,
        int $y_axis_type
    ): string {
        if (!count($ydata)) {
            return I18N::translate('This information is not available.');
        }

        // Colors for z-axis
        $colors = [];
        $index  = 0;
        while (count($colors) < count($ydata)) {
            $colors[] = self::Z_AXIS_COLORS[$index];
            $index    = ($index + 1) % count(self::Z_AXIS_COLORS);
        }

        // Convert our sparse dataset into a fixed-size array
        $tmp = [];
        foreach (array_keys($z_axis) as $z) {
            foreach (array_keys($x_axis) as $x) {
                $tmp[$z][$x] = $ydata[$z][$x] ?? 0;
            }
        }
        $ydata = $tmp;

        // Convert the chart data to percentage
        if ($y_axis_type === self::Y_AXIS_PERCENT) {
            // Normalise each (non-zero!) set of data to total 100%
            array_walk($ydata, static function (array &$x) {
                $sum = array_sum($x);
                if ($sum > 0) {
                    $x = array_map(static function ($y) use ($sum) {
                        return $y * 100.0 / $sum;
                    }, $x);
                }
            });
        }

        $data = [
            array_merge(
                [ I18N::translate('Century') ],
                array_values($z_axis)
            )
        ];

        $intermediate = [];
        foreach ($ydata as $century => $months) {
            foreach ($months as $month => $value) {
                $intermediate[$month][] = [
                    'v' => $value,
                    'f' => ($y_axis_type === self::Y_AXIS_PERCENT) ? sprintf('%.1f%%', $value) : $value,
                ];
            }
        }

        foreach ($intermediate as $key => $values) {
            $data[] = array_merge(
                [ $x_axis[$key] ],
                $values
            );
        }

        $chart_options = [
            'title' => '',
            'subtitle' => '',
            'height' => 400,
            'width'  => '100%',
            'legend' => [
                'position'  => count($z_axis) > 1 ? 'right' : 'none',
                'alignment' => 'center',
            ],
            'tooltip' => [
                'format' => '\'%\'',
            ],
            'vAxis' => [
                'title' => $y_axis_title ?? '',
            ],
            'hAxis' => [
                'title' => $x_axis_title ?? '',
            ],
            'colors' => $colors,
        ];

        return view(
            'statistics/other/charts/custom',
            [
                'data'          => $data,
                'chart_options' => $chart_options,
                'chart_title'   => $chart_title,
            ]
        );
    }
private function myPlot ( string $ chart_title , array $ x_axis , string $ x_axis_title , array $ ydata , string $ y_axis_title , array $ z_axis , int $ y_axis_type ) : string { if ( ! count ( $ ydata ) ) { return I18N :: translate ( 'This information is not available.' ) ; } // Colors for z-axis $ colors = [ ] ; $ index = 0 ; while ( count ( $ colors ) < count ( $ ydata ) ) { $ colors [ ] = self :: Z_AXIS_COLORS [ $ index ] ; $ index = ( $ index + 1 ) % count ( self :: Z_AXIS_COLORS ) ; } // Convert our sparse dataset into a fixed-size array $ tmp = [ ] ; foreach ( array_keys ( $ z_axis ) as $ z ) { foreach ( array_keys ( $ x_axis ) as $ x ) { $ tmp [ $ z ] [ $ x ] = $ ydata [ $ z ] [ $ x ] ?? 0 ; } } $ ydata = $ tmp ; // Convert the chart data to percentage if ( $ y_axis_type === self :: Y_AXIS_PERCENT ) { // Normalise each (non-zero!) set of data to total 100% array_walk ( $ ydata , static function ( array & $ x ) { $ sum = array_sum ( $ x ) ; if ( $ sum > 0 ) { $ x = array_map ( static function ( $ y ) use ( $ sum ) { return $ y * 100.0 / $ sum ; } , $ x ) ; } } ) ; } $ data = [ array_merge ( [ I18N :: translate ( 'Century' ) ] , array_values ( $ z_axis ) ) ] ; $ intermediate = [ ] ; foreach ( $ ydata as $ century => $ months ) { foreach ( $ months as $ month => $ value ) { $ intermediate [ $ month ] [ ] = [ 'v' => $ value , 'f' => ( $ y_axis_type === self :: Y_AXIS_PERCENT ) ? sprintf ( '%.1f%%' , $ value ) : $ value , ] ; } } foreach ( $ intermediate as $ key => $ values ) { $ data [ ] = array_merge ( [ $ x_axis [ $ key ] ] , $ values ) ; } $ chart_options = [ 'title' => '' , 'subtitle' => '' , 'height' => 400 , 'width' => '100%' , 'legend' => [ 'position' => count ( $ z_axis ) > 1 ? 'right' : 'none' , 'alignment' => 'center' , ] , 'tooltip' => [ 'format' => '\'%\'' , ] , 'vAxis' => [ 'title' => $ y_axis_title ?? '' , ] , 'hAxis' => [ 'title' => $ x_axis_title ?? '' , ] , 'colors' => $ colors , ] ; return view ( 'statistics/other/charts/custom' , [ 'data' => $ data , 'chart_options' => $ chart_options , 'chart_title' => $ chart_title , ] ) ; }
Plot the data.

@param string   $chart_title
@param string[] $x_axis
@param string   $x_axis_title
@param int[][]  $ydata
@param string   $y_axis_title
@param string[] $z_axis
@param int      $y_axis_type

@return string
Plot the data .