I'm using a Radar Chart similar to this example: https://pchart.net/doc.draw.radar.html

My data ranges from score 1 to 4, so I configured some options:

$options = array(
    'SegmentHeight' => 1,
    'Segments' => 3,
    'FixedMax' => 4
);

One problem remains: Even if my lowest score is 1, the Radar chart always has the value 0 in the center.

How can I change the minimum value in the chart to 1?

有帮助吗?

解决方案

You can create a "minimum" value, but only if you're willing to fork the library and make some changes.

Game plan

The easiest and most straightforward way to do so is to create a new option that I'll call FixedMin. If, and only if, this new option is provided (and the other criteria for non-auto-segmentation are met) will you achieve the effect you're seeking.

If you want a minimum to be generated without providing SegmentHeight, Segments, and FixedMax, you'll also need to modify pImage::computeScale which generates these configuration values when they're not provided.

We need to make three changes:

  1. Create a new configuration option called FixedMin
  2. Adjust the values' position
  3. Adjust the labels' text

Let's code

The drawRadar method is held in class/pRadar.class.php. Open it up. Let's walk through our game plan.

First, let's add the configuration option. I'll add it with the others (line ~38) like so:

 $FixedMin      = isset($Format["FixedMin"]) ? $Format["FixedMin"] : 0;

Let's have FixedMin default to 0 because that is the default pChart behavior.

Second, we need to somehow trick pChart into repositioning these larger values as if they were smaller to accomodate the offset FixedMin creates.

We can do that where the function computes the plots position (line ~319). Find the loop foreach($DataS["Data"] as $Key => $Value) (line ~328). Here, we'll modify the $Value by adding this line at the top of the loop:

$Value -= $FixedMin; // Let's offset the perceived value by our new minimum

Third, we need to change the axis labels' text values. Inside the conditional that $DrawAxisValues encompasses, you'll find this line of code (line ~255):

$Label  = ($j * $SegmentHeight)

This works great; for each segment, it generates a label that is the segment times the height (e.g., 4 segments of 20 units should generate 4 labels with: 20, 40, 60, 80). But it won't work with our FixedMin. Let's reuse the offset. In this case, we're incrementing by the offset, to generate the illusion of a minimum. Replace that line with this one:

$Label  = ($j * $SegmentHeight) + $FixedMin;

Recap

We created a new configuration variable for a minimum segment; and for each value, we subtracted that minimum value (or offset); and rejiggered the axis labels by adding that minimum value (or offset).

Caveats

We only modified radar charts; no other chart type will be affected. Do not attempt to use data with values that are below the configured minimum. The hazards of doing so may be why the author didn't include this option.

Show and tell

I don't have access to your data set, so I used the pChart example and bumped the "application review" sample so that all the scores were between 20 and 40.

// FixedMin set to 0, "default" behavior
$Options = array(
 'SegmentHeight' => 20,
 'Segments' => 2,
 'FixedMax' => 40,
 'FixedMin' => 0, // And so on...

Default behavior

As expected, now let's check out our new code...

// FixedMin set to 20, smaller SegmentHeight
$Options = array(
 'SegmentHeight' => 10,
 'Segments' => 2,
 'FixedMax' => 40,
 'FixedMin' => 20, // And so on...

With a minimum of 20

Ta-da.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top