I create a high chart using angular 4 and I want to highlight a particular portion of Highchart.
Ex Image :https://www.screencast.com/t/MHxo59j2dM
As per above image if data point value goes below to some limit (like 0) then highlight with "Red" color and if it goes below 8 then highlight with Yellow
I'm not sure whether its possible with Highchart or not but if someone had created this kind of features then please let me know.
Highchart provides Area Chart option - https://www.highcharts.com/demo/area-negative but my chart is normal and I don't want to highlight all series point.
There's no such functionality in Highcharts, but you can mimic it by using polygon series and plot lines:
var chart = Highcharts.chart('container', {
plotOptions: {
polygon: {
showInLegend: false
}
},
yAxis: {
tickInterval: 1,
plotLines: [{
value: 4,
color: 'orange',
width: 2
}, {
value: 3,
color: 'red',
width: 2
}]
},
series: [{
data: [6, 4, 3, 1, 2, 3, 4, 7]
}, {
type: 'polygon',
data: [[1,4], [2, 4], [2,3]],
color: 'orange'
}, {
type: 'polygon',
data: [[5,4], [6, 4], [5,3]],
color: 'orange'
}, {
type: 'polygon',
data: [[2,3], [5, 3], [4,2], [3,1], [2,3]],
color: 'red'
}]
});
Live working example: http://jsfiddle.net/kkulig/fbomb7cf/
It will require some programming to make the process of creating these areas automatic (in my fiddle everything is hard-coded).
To achieve similar styling you can try patter fill Highcharts plugin: https://www.highcharts.com/blog/extension/pattern-fill/
API references:
http://api.highcharts.com/highcharts/series.polygon
http://api.highcharts.com/highcharts/yAxis.plotLines
The goal
What i need is one Flot chart that contains different coloured bars, with different coloured lines over the top.
Many questions answer how to achieve different coloured bars.
And many pages answer how to add bars AND lines.
But i want to combine these two solutions.
An added bonus would be to be able to add custom parameters to each bar / line (see the "testId" example below) - however this is not necessarily required, as a workaround I could create an object on page load that references each bar's position (e.g. the "ticks" array).
My current workaround
I can already achieve this using multiple data sets as seen in this jFiddle, which i have constructed based off this answer's jFiddle, however this requires multiple different data sets per colour variant of each bar / line like so:
var dataBarsRed = {
data: [
[0, 1],
[2, 1.9],
],
color: 'red'
};
var dataBarsOrange = {
data: [
[1, 2],
[3, 3.9],
],
color: 'orange'
};
var dataBarsGreen = {
data: [
[4, 4],
[5, 4.5]
],
color: 'green'
};
var dataLineRed = {
data: [
[0, 2, 2],
[1, 2, 2],
[2, 2, 2],
[3, 2, 2],
[4, 2, 2],
[5, 2, 2],
],
label: '60% efficiency',
color: 'red',
bars: {
barWidth: 1
}
};
var dataLineOrange = {
data: [
[0, 4, 4],
[1, 4, 4],
[2, 4, 4],
[3, 4, 4],
[4, 4, 4],
[5, 4, 4],
],
label: '85% efficency',
color: 'orange',
bars: {
barWidth: 1
}
};
And add them like so:
$.plot("#placeholder", [dataBarsRed, dataBarsOrange, dataBarsGreen, dataLineRed, dataLineOrange],...
From what i can tell, there is no way to add any custom data parameters to this data structure, in which each item has it's own set of custom variables (e.g. object id's to link to the back-end, like "testId" - see "The Rationale").
The rationale
Is there a way to achieve what i need using the same structure for the bar data as the first link:
var data = [
{ data: [[0,1]], color: "red", testId: 30 },
{ data: [[1,2]], color: "yellow", testId: 31 },
{ data: [[2,3]], color: "green", testId: 32 }
];
The reason i'd like to do it this way is that it would be much simpler to build the Flot Data Object on the Java side (return it as JSON from ajax) but also it has the added benefit of adding your own parameters to each bar / line (e.g. "testId" shown above. The id's themselves would be utilised to retrieve more data via ajax on click or hover of the bar.
For Example:
$(container).bind('plothover', function(event, position, item){
console.log(item.series.testId)
});
Final thoughts
I feel like i'm going round in circles with this. I love the Flot charts plugin and it's flexibility, but there are numerous ways to implement the same visual outcome.
Thanks.
- Steve.
The Solution
See this jFiddle for the complete code.
After considering what Raidri is saying regarding it's simplicity, I've taken another stab at it and I've gotten something working as i need it to, with a bit more consistency. I feel a bit silly for not seeing this before (perhaps i did and a syntax error caused me to move on). Anyway, if anyone is interested here's the code:
NOTE: This does feel like a bodge or a hack - i'm not sure if this kind of data structure was ever intended, but it gets the job done for my purposes.
var data = [
{ data: [[0,1]], color: "red", testId: 30, isBar: true },
{ data: [[1,2]], color: "orange", testId: 31, isBar: true },
{ data: [[2,1.9]], color: "red", testId: 32, isBar: true },
{ data: [[3,3.9]], color: "orange", testId: 33, isBar: true },
{ data: [[4,4]], color: "green", testId: 34, isBar: true },
{ data: [[5,4.5]], color: "green", testId: 35, isBar: true },
{ data: [[0, 4, 4],[0.5, 4, 4],[1, 4, 4],[1.5, 4, 4],[2, 4, 4],[2.5, 4, 4],[3, 4, 4],[3.5, 4, 4],[4, 4, 4],[4.5, 4, 4],[5, 4, 4]], shadowSize: 0, color: 'orange', isLine: true, label: '85% efficiency' },
{ data: [[0, 2, 2],[0.5, 2, 2],[1, 2, 2],[1.5, 2, 2],[2, 2, 2],[2.5, 2, 2],[3, 2, 2],[3.5, 2, 2],[4, 2, 2],[4.5, 2, 2],[5, 2, 2]], shadowSize: 0, color: 'red', isLine: true, label: '60% efficiency' },
{ data: [[0, -1, -1]], shadowSize: 0, color: 'green', label: '100% efficiency', isLine: true }
];
var plot = $.plot("#placeholder", data, {
bars: {
show: true,
align: 'center',
barWidth: 0.5
},
lines: {
show: true,
lineWidth: 0.1,
fill: false
},
grid: {
hoverable: true,
autoHighlight: true
},
xaxis: {
ticks: [[0,'Steve'],[1,'Bob'],[2,'Chris'],[3,'Joe'],[4,'Dave'], [5, 'Jon']]
},
yaxis: {
min: 0,
max: 5
},
legend:{
container: '#legend'
}
});
There are some slight nuances, such as the number of line points (data elements per line) need to take into account the bar width. E.g. if my bar width was 1 i'd only need 5 elements, but since i have a width of 0.5 i need 10 line elements per data array (to fill in the gaps). Also, "shadowSize: 0" is required or you'd get a grey shadow in the middle of the line.
I've also added "isBar" and "isLine" to each element so my hover event can distinguish between them so it does not update the info box when the line is hovered. This is because the way I've done this is a bit of a "hack" in the sense that the line is not one line, but a line per column. Without this further distinction of type, hovering over the line would display the bar's name depending on your mouse's x-position.
I've also had to add a "fake" green line for the legend - position 0, referencing start and end positions that are outside the axis range (-1, in this example, 6 would also work). I realise i can probably create a custom legend...but it was simpler to just let flot deal with it itself.
You can simply combine your five data objects into one array of objects und you can also add your own properties to these objects, like this:
var data = [ {
data: [
[0, 1],
[2, 1.9],
],
color: 'red',
testId: 31
}, {
data: [
[1, 2],
[3, 3.9],
],
color: 'orange',
testId: 32
}, {
//...
}];
And using your own properties for example in the hover-event is as simple as
$('#details').html("<span class='detail'>...(testId = " + item.series.testId + ")</span>");
See the updated fiddle for the full example.
PS: For the lines in your chart, maybe markings are a better fit (see the documentation and this fiddle, where one of the lines is replaced by a marking).
I'm using Chart.js to create a line chart. I would like to have four different datasets that will all be visibile by default, but can be toggled on and off by clicking a button. How can this be achieved? I can't seem to find an answer in the documentation. .addData(), .removeData() and .update() all seem to be used for adding or removing values to existing datasets, but not adding or removing entire datasets. I would think this would be fairly commonly used feature but I can't find an answer anywhere.
After thoroughly researching this, there doesn't appear to be any built in function to toggle entire datasets. I used the .destroy() function to remove the entire existing chart, and then some logic to redraw it with the necessary datasets.
EDIT: Here's a fiddle with my full code if it's helpful to anyone -> http://jsfiddle.net/21xg27kr/4/
Here is a line chart with two datasets. By updating the datasets and calling the .update() method. The benefit here is you don't need to destroy the whole chart, and there is a nice animated transition which can be disabled.
TL:DR; solution on jsfiddle
Step by Step:
Bring in Chart.js from a CDN
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.min.js"></script>
Create the HTML Canvas element that will hold the chart
<canvas id="line-chart"></canvas>
Hide/Show buttons for this example
Creating the chart, and the functions to update it live - notice that the same integer data needs to be copied in two places - in the initial creation, and in the show function.
<script>
lineChart = new Chart(document.getElementById("line-chart"), {
type: 'line',
data: {
labels: ['A', 'B', 'C', 'D'],
datasets: [
{
label: "Set 1",
fill: true,
backgroundColor: "rgba(90,181,242,0.2)",
borderColor: "rgba(179,181,198,1)",
pointBorderColor: "#fff",
pointBackgroundColor: "rgba(179,181,198,1)",
data: [3, 1, 1, 0]
}, {
label: "Set 2",
fill: true,
backgroundColor: "rgba(255,99,132,0.2)",
borderColor: "rgba(255,99,132,1)",
pointBorderColor: "#fff",
pointBackgroundColor: "rgba(255,99,132,1)",
pointBorderColor: "#fff",
data: [1, 3, 3, 5]
}
]
},
options: {
title: {
display: true,
text: 'Chart Title'
}
}
});
function restoreLayer2(){
lineChart.data.datasets[1].data = [1, 3, 3, 5];
lineChart.update();
}
function removeLayer2() {
lineChart.data.datasets[1].data = [];
lineChart.update();
}
</script>
highcharts would fit perfectly if not for one "but". The strip chart goes behind the axis. The line graph is beyond the axis numbers(50, 100, 150, 200). Watched others but have not found where you can easily stylize the behavior of the graph by accessing its axis
chart like this
Simply disable margins for chart, then play with yAxis.offset to move labels to the right: http://jsfiddle.net/Ywr3L/33/
$('#container').highcharts({
chart: {
marginLeft: 0,
marginRight: 0
},
xAxis: {
type: 'datetime'
},
yAxis: {
offset: -120
},
series: [{
data: [ 1, 2, 3, 2, 3, 2, 1, 2, 3, 2 , 1, 2, 3, 4],
type: 'areaspline'
}]
});
Note: without extra coding you can't start series shape before starting of gridlines.