【问题标题】:high-charts datalabel position needs to change when value is too small当值太小时,高图表数据标签位置需要改变
【发布时间】:2012-09-19 00:41:26
【问题描述】:

数据标签(在本例中为现金)大部分时间出现在正确的位置,就在右侧栏内。但是,如果条的值足够低,它最终会与轴标签重叠(如紫色条所示)。

我的第一反应是设置一个最大值并以此为基础更改数据标签的位置。例如,如果价值小于 10 美元,则将标签放在栏的右侧。但这种方法存在一个大问题。图表的大小是可变的和响应的,因此阈值需要是可变的。

理想情况下,应该测量条形本身并与数据标签的宽度进行比较以确定位置。实现该解决方案让我不知所措。我没有运气从高位图表或数据标签中获取条形的物理尺寸。

提前谢谢各位!


在 Android 2.1 设备上更新 Jugal Thakkar 的解决方案

【问题讨论】:

  • 不使用条形大小,为什么不使用 div 容器来处理 highchart svg?这将为您提供图表画布的宽度,如果调整浏览器大小,这也将起作用。
  • 因为条件取决于栏的大小

标签: javascript android canvas highcharts responsive-design


【解决方案1】:

您可以在高位图表中使用attr更改 X 和 Y 位置。

按,默认数据标签绘制在条形之外。所以,我猜你应该在 data Labels 属性中设置 X 和 Y 位置。

你可以这样做

function(chartObj) {
    $.each(chartObj.series[0].data, function(i, point) {
        if(point.y <=10) {
            point.dataLabel.attr({x:point.dataLabel.x+30});
        }
    });

加载图表后调用此方法。

这里是fiddle link 供参考。

【讨论】:

  • +1 为工作解决方案,@Fresheyeball 在继续此操作之前,您可能需要考虑浏览器的兼容性,因为它仅适用于支持 SVG(阅读 IE9+)的浏览器@en.wikipedia.org/wiki/Scalable_Vector_Graphics
  • @Fresheyeball,对不起,我的错误是我错误地认为.attr() 方法是特定于 svg 的方法,但它是由 highcharts 封装的。所以应该在 svg 和 vml 上工作。
  • 我们的目标是 iOS 和 Android,所以 SVG 和 Canvas
  • @Fresheyeball 那么它有用吗?如果是这样,请相应地标记它或让我们知道任何缺点以提供更好的帮助
  • 问题是这样的:point.y &lt;=10 不是动态的。我不知道该放什么号码。一些图表的范围非常高,而另一些则非常低。此外,设备分辨率变化很大,因此它不能是任意条件,它必须基于几何形状。
【解决方案2】:

再次更新。将适用于 Highcharts 支持的所有设备。


我认为this solution 会满足您的需求。

【讨论】:

  • 我无法使用基于通过.attr 进行事实更正后的解决方案,因为基于画布中的 android 版本。
  • .attr 依赖于 SVG 或 VML,其中 dom 中有实际元素需要操作。 Android 使用 Canvas,因此无需 .attr on。
  • @Fresheyeball 您是否在 android 上尝试过该解决方案?我认为 highchart 包装器隐藏了 SVG/VML/Canvas 的 .attr()(不确定)。抱歉,附近没有 android 来尝试这个,甚至没有我发布的解决方案,所以一旦你尝试了任何解决方案,如果你能回复我们关于它是否有效的信息,那就太好了目标设备,或者如果不是预期的行为是什么
  • 我已经测试过了。而且它也不适用于画布,这是有道理的。
  • @Fresheyeball 我认为我找到了解决方案。请尝试一下,我更新了我的答案。
【解决方案3】:

你可以试试这个,

var alignDataLabels = function() {
    var chartObj = window.chart || this;
    $.each(chartObj.series[0].data, function(i, point) {
        var dataLabel = point.dataLabel;
        // Get the current X
        var x = dataLabel.translateX;
        var y = dataLabel.translateY;
        // If the goes on LHS of the axis
        if (x < 0) {
            // Set the label's X to 5 px more than the bar's height(length) in pixels
            dataLabel.translate(point.barH + 5, y);
        }
    });
};

jsFiddle@http://jsfiddle.net/jugal/TCjJy/

我的安卓屏幕截图(用户代理:Android 4.1.1 AppleWebKit/534.30 (KHTML, like Gecko)

【讨论】:

  • @Fresheyeball 对不起? x
  • Android 4.1 支持 SVG。最流行的版本 2.2 froyo 没有。我必须支持当前低至 2.1。
  • 正是我要求反馈的原因,这是我得到的唯一设备
  • @Fresheyeball 再次重申这一点,更新的解决方案在目标设备上是否有效?如果不是,请留下评论以清除该问题,以便我可以将答案拉出来。另一个建议是在问题中清楚地添加这些重要信息以及标签,以便合适的人可以回答,并且不会浪费任何人的时间来解决错误的问题
  • 我在收到的第一个答案的 cmets 中直接向您透露了这一事实。下次我会标记 android,感谢您的帮助和建设性反馈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-24
  • 2022-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多