Highcharts blank chart with x and y axis - javascript
I want to use highcharts creating a blank chart with no datas but x and y axis.
How to do it?
var chart = new Highcharts.Chart({
chart: {
renderTo: 'container'
},
yAxis: {
labels: {
formatter: function() {
return this.value +' km';
}
}
},
series: [{
data: []
}]
});
it returns
But I want to display y-axis with label.
You can put in your min/max values for the xAxis and yAxis and use null for all data.
Forked from #ZaheerAhmed's response above as I figure it deserves a spot as an alternative solution without needing to hide the data after the fact.
i.e.
yAxis: {
min: 1,
max:
} ,
xAxis: {
min: 1,
max: 50
},
series: {
data:[null,null]
}
You can put data and hide the series after setting property
ignoreHiddenSeries : false
Here is Working Demo If you hide the series Y-Axis will still be visible.
FWIW, it seems that highcharts has this functionality built in yAxis.showEmpty
Unfortunately, the fiddle listed in the documentation doesn't work, and there is a related open highcharts issue on the matter:
no hide y axis
Setting min and max for xAxis and yAxis is not a good solution! Because if the data is loaded later (When it's resolved), then you won't have auto calculated min and max. In Highcharts API, it's said:
If null, the max value is automatically calculated
So you should set min and max back to null when the data is loaded. But in my case setting it to null or even deleting the option, didn't result in automatic calculating (Seems strange).
What I did instead was setting charts.showAxes to true! That's it. Take a look at the demo provided by Highcharts
Important: You of course need to set series to something like this:
series: [
{
data: [null, null, null]
},
{
data: [null, null, null]
}
]
Note: Make sure xAxis.showEmpty and yAxis.showEmpty are set true (which is true by default).
Related
Reversed bullet chart in Highcharts
I started working with highcharts. Now a problem I am facing is that the bulletcharts can’t be used for a dataset that is in descending order. For example say we want to plot the ranking of a few companies. In this case the ranking is better the lower it gets. So a Rank 10 is better than a Rank 15 and so on. In this case I want my graph to get reversed. The target would be lets say 10. The min value would start from say 100 to 0. So you can see how this isnt possible. P.S: I know the reverse: true/false property. But that simply flips the graph and I don’t want that/need that. Thanks world.
You can add a second y-axis with the same extremes as the first one, but reversed. Next, hide the first y-axis, calculate mocked y and target values and finally, set a custom formatter function for tooltip to show original values. const MAX = 300; const TARGET = 50; const Y = 25; Highcharts.chart('container1', { chart: { inverted: true, type: 'bullet', }, yAxis: [{ visible: false, min: 0, max: MAX }, { min: 0, max: MAX, reversed: true, ... }], tooltip: { formatter: function(tooltip) { const point = this.point; return `<span style='color: ${this.color}'>●</span> ${this.series.name}: <b>${point.originalY}</b>. Target: <b>${point.originalTarget}</b><br/>` } }, series: [{ data: [{ y: MAX - Y, target: MAX - TARGET, originalY: Y, originalTarget: TARGET }] }] }); Live demo: https://jsfiddle.net/BlackLabel/ve8hosd3/ API Reference: https://api.highcharts.com/highcharts/tooltip.formatter
Highcharts with custom scaling in upper regions
I would like to know how to achieve a custom scale for a chart in Highcharts. I want to display a boxplot which has very high whiskers. The normal values to display are between 500 and 1000 but there are some anomalies which are about 6000 on y-axis. This is causing the whole chart to be squeezed and the scaling is so small that you can't determine the boxplots correctly. I would like to increase the tick-size between 1000 and 6000 to decrease the heigt of the chart.
Highcharts provides breaks functionality that seems to be ideal for your case: https://api.highcharts.com/highcharts/yAxis.breaks Another approach is to change the yAxis type to logarithmic: https://api.highcharts.com/highcharts/yAxis.type EDIT The discussion in the comments section reveals that the OP needs rather custom y axis formatting than breaks functionality. Here's how to approach this issue: The problem here is that axes in Highcharts can only have either constant or logarythmic scales. Your example shows irregular scale - the values are not in constant or logarythmic order ([0, 3, 10, 30, 150]). Here's what I've done to mimic that kind of look and behaviour: I set tickPositions to [0, 1, 2, 3, 4] - these are the actual values that appear on the chart. As you can see the distance between all these numbers is constant: 1. Then I used formatter to display corresponding number from ranges array for each label. yAxis: { tickPositions: [0, 1, 2, 3, 4], labels: { formatter: function() { return ranges[this.pos]; } } }, Before I passed the data to the chart constructor I converted all the values so that they're between 0 and 4: series: [{ data: [2, 120].map(function(val) { var range = findRange(val); var y = range.index + (val - range.low) / (range.high - range.low); return { y: y, originalValue: val }; }) }] Finally I used originalValue property in tooltip.format string to print to the user the number before the conversion. tooltip: { pointFormat: "<span style='color:{point.color}'>\u25CF</span> {series.name}: <b>{point.originalValue}</b><br/>" }, This example is simplified to the line series case but can be easily adjusted to boxplot series. The code serves only for the example purposes and should be improved - it's easy to cause an error within it. Live working demo: https://jsfiddle.net/kkulig/ytjz1jej/ API references: https://api.highcharts.com/highcharts/tooltip.pointFormat https://api.highcharts.com/highcharts/yAxis.tickPositions https://api.highcharts.com/highcharts/xAxis.labels.formatter
C3 Bar Graph x-axis labels are too congested
I have created a Bar graph using C3 JS plugin, The graph is working fine but the problem is with the x-axis labels looks too congested like as shown below Working JSFiddle My Code is as given below var chart = c3.generate({ bindto: "#chart", data: { x : 'x', columns: [ ['x', "2016-04-01","2016-04-08","2016-04-15","2016-04-22","2016-04-29","2016-05-06","2016-05-13","2016-05-20","2016-05-27","2016-06-03","2016-06-10","2016-06-17","2016-06-24","2016-07-09","2016-07-10","2016-07-11","2016-07-12","2016-07-13","2016-07-15","2016-07-16","2016-07-17","2016-07-18","2016-07-19","2016-07-20","2016-07-21","2016-07-22","2016-07-23","2016-07-24","2016-07-25","2016-07-26","2016-07-27","2016-07-28","2016-07-29","2016-07-30","2016-07-31","2016-08-01","2016-08-02","2016-08-03","2016-08-04","2016-08-05","2016-08-06","2016-08-07","2016-08-08","2016-08-09","2016-08-10","2016-08-11","2016-08-12","2016-08-13","2016-08-14","2016-08-15","2016-08-16","2016-08-17","2016-08-18","2016-08-19","2016-08-20","2016-08-21","2016-08-22","2016-08-23","2016-08-24","2016-08-25","2016-08-26","2016-08-27","2016-08-28","2016-08-29","2016-08-30","2016-08-31","2016-09-01","2016-09-02","2016-09-03","2016-09-04","2016-09-05","2016-09-06","2016-09-07","2016-09-08","2016-09-09","2016-09-10","2016-09-11","2016-09-12","2016-09-13","2016-09-14","2016-09-15","2016-09-16","2016-09-17","2016-09-18","2016-09-19","2016-09-20","2016-09-21","2016-09-22","2016-09-23","2016-09-24","2016-09-25","2016-09-26","2016-09-27","2016-09-28","2016-09-29","2016-09-30","2016-10-01","2016-10-02","2016-10-03","2016-10-04","2016-10-05","2016-10-06","2016-10-07","2016-10-08","2016-10-09","2016-10-10","2016-10-11","2016-10-12","2016-10-13","2016-10-14","2016-10-15","2016-10-16","2016-10-17","2016-10-18","2016-10-19","2016-10-20","2016-10-21","2016-10-22","2016-10-23","2016-10-24","2016-10-25","2016-10-26","2016-10-27","2016-10-28","2016-10-29","2016-10-30","2016-10-31","2016-11-01","2016-11-02","2016-11-03","2016-11-04","2016-11-09"], ['pv1', 2500,2500,2500,2500,2500,2500,2500,2500,2500,2500,2500,2500,2500,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2748,2748,2694,2694,2694,2694,2694,2694,2694,2668,2668,2668,2668,2576,2572,2572,3043,3084,3084,3084,3084,3084,3156,3521,3521,3550,3542,3542,3573,3580,3629,3579,3584,3542,2757,2791,2696,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3415,3414,3414,3414,3414,3414,3414,3414,3414,3414,3414,3414,3414,3414,3369,3376,3371,3373,3371,3379,3363,3373,3347,3348,3382,3402,3410,3434,2579,2579,2369], ['pv2', 1750,1750,1750,1750,1825,1850,1975,2150,2375,2425,2475,2500,2500,2087,2087,2087,2087,2091,2087,1767,1767,1767,1633,1498,1498,1642,1637,1633,1609,1841,1713,1702,1862,1888,1888,1888,1949,1976,1977,2014,2014,2014,1946,1966,1973,2224,2252,2318,2318,2318,2327,2373,2513,2535,2543,2534,2539,2823,2849,2990,3142,3142,3108,2513,2687,2678,2856,2860,2861,2862,2866,2869,2870,2875,2874,2874,2874,2879,2885,2886,2883,2889,2896,2895,2899,2903,2909,2911,2913,2913,2913,2916,2922,2933,2937,2943,2942,2943,2947,1811,1826,1837,1840,1840,1841,1843,1511,1854,1853,1851,1852,1853,1849,1852,1874,1857,1883,1886,1888,1904,1903,1924,1947,2060,2068,2068,2082,1582,1344,836,839,788] ], type: 'bar' }, axis: { x: { type: 'category', tick: { rotate: -60, multiline: false }, height: 130 } } }); Can anyone please tell me some solution for this What I did to solve it I have used timeseries type instead of category type, after that the label issue got resolved but the graph was been plottted with more white spaces for the month of march like as shown below Working JSFiddle
You can use c3's tick count setting for this, so here we say 20 labels. However there is an added gotcha in that ticks that now resolve to a fractional category value won't show - i.e. the 2nd equally spaced tick out of 20 may be the 2.6667th element in the x category axis - so you need to have a little format function that adjusts for this, otherwise you just get the end and start labels. (Or you could figure out a tick count that divides into your data count + 1 as a whole number.) tick: { format: function (x) { var cats = this.api.categories(); return cats[Math.round(x)]; }, count: 20, rotate: -60, multiline: false }, http://jsfiddle.net/fz0t10yb/7/
One of the possible solution could be to use x-axis labels at required indexes only & leaving others blank. ['x', "2016-04-01","","","","2016-04-29","","","",...] ['pv1', 2500,2500,2500,2500,2500,2500,2500,2500,...] ['pv2', 1750,1750,1750,1750,1825,1850,1975,2150,...] You can position labels so that it would capture the date and at same time it looks good also.
highcharts - Hide some labels in yAxis
I have a chart with a yAxis, that has a minimum of -5, and max of 5. The yAxis has these labels: -5, -2.5, 0, 2.5, 5. My config is so close - I have the right amount of grid/plot lines, but I want to hide a couple of the text labels in the yAxis (not the actual lines relating to the label). In other words, I want to remove or hide the -2.5 and 2.5 labels. I've tried various methods in the yAxis, eg step, but it's not achieving what I want. yAxis: { labels: { step: 5 } } JSFiddle Any ideas how to achieve this?
I nearly didn't post this question because I found a (non-SO) answer - perhaps this will help others. I don't know if this is the most elegant approach for highcharts, but you can use the label formatter to achieve this. In my case, instead of this: labels: { formatter: function () { return this.value+'%'; } } We can add a conditional to check the label's value, and only return something if it's what we want. All together: yAxis: { //... labels: { formatter: function () { if (this.value !== -2.5 && this.value !== 2.5) { return this.value+'%'; } }, step: 1 }, //... }, Example Warning: hard coding some values and depending on them in this way is risky if you have dynamic data. For this instance we don't have dynamic data, they will be fixed, so it's safe for us. Another approach could be to iterate over each value/label and only return every X child as you require.
Use a variable for Highcharts yAxis.Max
Im trying to pass a variable('maxValue') into my Highcharts guage . I cant get the variable to pass in successfully, the graph renders but without the value. Ive tried Number and parseInt Functions but neither make a difference. I setup a JS fiddle here: http://jsfiddle.net/d5d4cgbe/16/ The code section in question: var maxValue = 120; //set the maxValue var $('#visitPerformanceWeek').highcharts(Highcharts.merge(gaugeOptions, { yAxis: { min: 0, max: maxValue, title: { text: 'Hours Worked' } }, I will eventually be passing a value collected from an AJAX request, this part I have working but have excluded from the fiddle to keep it simple. Help appreciated
For setting the maxValue dynamically, something like setExtremes should do it. Try chart.yAxis[0].setExtremes(0,maxValue); Another alternative is the update method: chart.yAxis[0].update({ max: maxValue }); For the maxValue to be displayed by the solidgauge, you need to specify a tickerInterval which divides into the maxValue. Presently, the chart is generating a default tick interval e.g. 10, which adds up to 100. For example, a maxValue of 120, you may set the tickInterval to 12 yAxis: { min: 0, max: 120, tickInterval: 12, ... } JSFiddle
Check here : http://jsfiddle.net/d5d4cgbe/23/ you can set value using following command : chart.yAxis.max = maxValue; check browser console for yAxis value.