5

我想根据 y 轴值在背景图上显示 3 个颜色区域,据我了解,我无法通过不同颜色控制背景颜色。

我的想法是用 canvasOverlay 绘制 3 条水平线 - 这是有效的。问题是我想把这条线放在我的图形曲线后面,现在它在前面看到,它覆盖了我的点线。

我可以更改 z-index 或不透明度的属性吗?

也许还有其他想法?

  $.jqplot( 'ChartDIV', [data],
        {
            series: [{ showMarker: true}],
            highlighter: {
                sizeAdjust: 10,
                show: true,
                tooltipLocation: 'n',
                useAxesFormatters: true
            },

            tickOptions: {
                formatString: '%d'
            },
            canvasOverlay: {
                show: true,
                objects: [ 
                            {
                                horizontalLine: 
                                {      
                                    name: 'low', 
                                    y: 1.0,
                                    lineWidth: 100,
                                    color: 'rgb(255, 0, 0)',
                                    shadow: false 
                                }
                            },      
                            {
                                horizontalLine:
                                { 
                                    name: 'medium',
                                    y: 2.0,
                                    lineWidth: 100, 
                                    color: 'rgb(250, 250, 0)', 
                                    shadow: true 
                                }
                            },
                            {
                                 horizontalLine:
                                {
                                    name: 'high',
                                    y: 3.0,
                                    lineWidth: 100,
                                    color: 'rgb(145, 213, 67)',
                                    shadow: false
                                }
                             },  
                        ]       
                    },
            axes: {
                xaxis:
                {
                    label: 'Dates',
                    renderer: $.jqplot.DateAxisRenderer,
                    rendererOptions: { tickRenderer: $.jqplot.CanvasAxisTickRenderer },
                    tickOptions: {
                        formatString: '%d/%m/%Y',
                        angle: -30,
                        fontFamily: 'Arial',
                        fontSize: '13px',
                        fontWeight: 'bold'
                    },
                    min: d[0] + "/" + d[1] + "/01", 
                    tickInterval: '2 month',
                    labelOptions: {
                        fontFamily: 'Arial',
                        fontSize: '14pt',
                        fontWeight: 'bold',
                        textColor: '#0070A3'
                    }
                },
                yaxis:
                {
                    label: 'Level',
                    labelRenderer: $.jqplot.CanvasAxisLabelRenderer,
                    tickOptions: {
                        formatter: $.jqplot.tickNumberFormatter
                    },
                    rendererOptions: { tickRenderer: $.jqplot.CanvasAxisTickRenderer },
                    labelOptions: {
                        fontFamily: 'Arial',
                        fontSize: '14pt',
                        fontWeight: 'bold',
                        textColor: '#0070A3',
                        angle: -90
                    }

                }
            }
        } );
4

2 回答 2

8

我认为您的问题可能是您绘画的顺序。我认为您首先创建图表,然后在其中绘制这条线,对吗?

因此,为了解决这个问题,您可以尝试jqPlot图表提供的一种挂钩。

要了解如何使用钩子,请查看我的另一个答案postDrawHooks(顺便说一句,我自己的问题:),在绘制图表后,我使用钩子来更改标签的格式。在您的情况下,您可以使用preDrawHooks或者更合适的是使用preDrawSeriesHooks,因为我不确定在调用传入的函数时画布是否可以使用preDrawHooks

请记住,根据文档preDrawSeriesHooks每次绘制系列之前都会调用 ,因此在您的情况下,您只需要它工作一次。

编辑

在这种情况下,答案很简单,你可以两者都做,这在我的 jsfiddle 中显示,可在此处获得

您需要这段代码将覆盖画布发送到后面,您应该在绘制图形的代码之前放置它:

$.jqplot.postDrawHooks.push(function(){
    $(".jqplot-overlayCanvas-canvas").css('z-index', '0');//send overlay canvas to back
    $(".jqplot-series-canvas").css('z-index', '1');//send series canvas to front
});

但是当涉及到不透明度时,您可以将其应用于您喜欢的任何一行(也显示在我的代码中),使用该rgba()方法,对于系列,它是通过这种方式完成的:

seriesColors:['rgba(100, 150, 100, 0.75)']

对于画布上的线条,您可以这样做:

color: 'rgba(145, 213, 67, 0.25)'

编辑2

最重要的想法被遗忘了,因此在之前的代码中,荧光笔不起作用。只是负责事件捕获和传播的事件画布隐藏在我们的画布下面。在当前版本的代码中,它已通过设置一个适合z-index它的方式进行了更正。完整的方法如下所示:

$.jqplot.postDrawHooks.push(function() {
    $(".jqplot-overlayCanvas-canvas").css('z-index', '0'); //send overlay canvas to back  
    $(".jqplot-series-canvas").css('z-index', '1'); //send series canvas to front         
    $(".jqplot-highlighter-tooltip").css('z-index', '2'); //make sure the tooltip is over the series
    $(".jqplot-event-canvas").css('z-index', '5'); //must be on the very top since it is responsible for event catching and propagation
});

EDIT3: 一个更好的解决方案,我们不需要担心设置z-index.

$.jqplot.postDrawHooks.push(function() {
    var overlayCanvas = $($('.jqplot-overlayCanvas-canvas')[0])
    var seriesCanvas = $($('.jqplot-series-canvas')[0])
    seriesCanvas.detach();
    overlayCanvas.after(seriesCanvas);
});

这里介绍。该解决方案的灵感来自@Mark为类似问题提供的答案。

于 2012-05-03T08:51:02.263 回答
1

一个更好的解决方案是使用 Canvas 矩形对象而无需任何黑客攻击 http://services.mbi.ucla.edu/jqplot/examples/draw-rectangles.html

$(document).ready(function(){
  var plot1 = $.jqplot ('chart1', [[30,-10,90,20,50,130,80,120,50]], {
      canvasOverlay: {
        show: true,
        objects: [
          { rectangle: { ymax: 0, xminOffset: "0px", xmaxOffset: "0px", yminOffset: "0px", ymaxOffset: "0px",
                    color: "rgba(0, 0, 200, 0.3)", showTooltip: true, tooltipFormatString: "Too Cold" } },
          { rectangle: { ymin: 100, xminOffset: "0px", xmaxOffset: "0px", yminOffset: "0px", ymaxOffset: "0px",
                    color: "rgba(200, 0, 0, 0.3)", showTooltip: true, tooltipFormatString: "Too Warm" } }
        ]
      } 
  });
});
于 2014-08-18T15:33:27.823 回答