我想根据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
}
}
}
} );
答案 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" } }
]
}
});
});