jqPlot - 如何更改canvasOverlay的不透明度或z-index?

时间:2012-05-03 06:24:57

标签: jqplot

我想根据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
                    }

                }
            }
        } );

2 个答案:

答案 0 :(得分:8)

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

因此,为了理清这一点,您可以尝试jqPlot图表提供的其中一个钩子。

要了解如何使用钩子,please see my other answer(顺便提一下我自己的问题:)我在绘制图形时使用postDrawHooks钩子来更改标签的格式。在您的情况下,您可以使用preDrawHooks或者更合适的是使用preDrawSeriesHooks,因为我不确定在调用preDrawHooks中传递的函数时是否可以使用画布。

请记住,according to the documentation,每次在绘制一个系列之前调用preDrawSeriesHooks,因此在您的情况下,您只需要它一次就可以使用它。

修改

在这种情况下,答案很简单,你可以做到这两点,这在我的jsfiddle中显示,available here

您需要使用这段代码将叠加画布发送回来,您应该在代码绘制图形之前放置:

$.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)'

<强> EDIT2

最重要的想法因此被遗忘,因为之前的代码荧光笔无法正常工作。只是负责事件捕获和传播的事件画布隐藏在我们的画布下面。通过为其设置适当的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);
});

It is presented here.此解决方案inspired by the answer provided by @Mark解决了类似的问题。

答案 1 :(得分: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" } }
        ]
      } 
  });
});