【问题标题】:pChart Radar chart with minimum 1pChart 雷达图,最少 1
【发布时间】:2013-12-19 11:05:35
【问题描述】:

我正在使用类似于此示例的雷达图: https://pchart.net/doc.draw.radar.html

我的数据范围从 1 到 4,所以我配置了一些选项:

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

还有一个问题:即使我的最低分数是 1,雷达图的中心值也始终为 0。

如何将图表中的最小值更改为 1?

【问题讨论】:

  • 如果你降低了你的最低值怎么办?那么这将默认为中心,对吗?
  • 我也这么想,但是不行。最小值为 1,但雷达仍显示 0 值。
  • 如果你从所有值中减去一个,那么你的范围将是 0-3。这有望将您的价值观置于中心位置。然后您可以更改标签以显示 1-4。

标签: pchart


【解决方案1】:

您可以创建一个“最小”值,但前提是您愿意分叉库并进行一些更改。

游戏计划

最简单、最直接的方法是创建一个新选项,我将其命名为FixedMin。当且仅当提供此新选项(并且满足非自动分段的其他标准)时,您才能达到您想要的效果。

如果您希望在不提供SegmentHeightSegmentsFixedMax 的情况下生成最小值,则还需要修改pImage::computeScale,以便在未提供这些配置值时生成它们。

我们需要做三处改变:

  1. 创建一个名为FixedMin 的新配置选项
  2. 调整值的位置
  3. 调整标签的文字

让我们编码

drawRadar 方法保存在class/pRadar.class.php 中。打开它。让我们来看看我们的游戏计划。

首先,让我们添加配置选项。我会将它与其他(第 ~38 行)一起添加,如下所示:

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

FixedMin 默认为0,因为这是默认的 pChart 行为。

第二,我们需要以某种方式欺骗 pChart 重新定位这些较大的值,就好像它们更小,以适应 FixedMin 创建的偏移量。

我们可以在函数计算绘图位置(第 ~319 行)的地方做到这一点。找到循环foreach($DataS["Data"] as $Key => $Value)(~328 行)。在这里,我们将通过在循环顶部添加这一行来修改$Value

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

第三,我们需要改变轴标签的文本值。在$DrawAxisValues 包含的条件内,您会发现这行代码(第~255 行):

$Label  = ($j * $SegmentHeight)

这很好用;对于每个段,它会生成一个段乘以高度的标签(例如,20 个单位的 4 个段应该生成 4 个标签:20、40、60、80)。但它不适用于我们的FixedMin。让我们重用偏移量。在这种情况下,我们会增加偏移量,以产生最小值的错觉。用这一行替换该行:

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

回顾

我们为最小分段创建了一个新的配置变量;对于每个值,我们减去最小值(或偏移量);并通过添加最小值(或偏移量)来重新调整轴标签。

注意事项

我们只修改了雷达图;不会影响其他图表类型。 不要尝试使用低于配置最小值的数据。这样做的危险可能是作者没有包含此选项的原因。

展示和讲述

我无权访问您的数据集,因此我使用了 pChart 示例并修改了“应用程序审查”示例,使所有分数都在 20 到 40 之间。

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

正如预期的那样,现在让我们看看我们的新代码...

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

塔达。

【讨论】:

  • 我将奖励您进行研究和概念验证(在时间用完之前),并在我实施后立即接受答案。非常感谢,雅各布!
  • 谢谢,很有帮助!!
猜你喜欢
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
  • 2021-07-31
相关资源
最近更新 更多