I want to make the graph start at 0 (as shown in the picture) and have the string formatted according to the regular expression replace(/\B(?=(\d{3})+(?!\d))/g, " ") but all my attempts are unsuccessful.
chartOptions: {
colors: ['#3DC3FB', '#FF5252', '#D2F449', '#179877'],
title: {
text: "",
},
credits: {
enabled: false
},
tooltip: {
formatter: function () {
if (this.x > 0) {
return this.x;
} else return false;
},
},
plotOptions: {
series: {
enableMouseTracking: false,
states: {
hover: {
enabled: false
},
normal: {
animation: false
},
select: {
enabled: false
}
}
},
},
xAxis: {
gridLineWidth: 1,
tickmarkPlacement: 'on',
lineColor: "#A4A4A4",
min: 0,
categories: [null, "10 лет"],
top: 10,
right: -100,
title: {
style: {
color: "#A4A4A4"
}
},
},
yAxis: {
gridLineWidth: 0,
tickColor: 'undefined',
tickLength: 5,
tickWidth: 1,
tickPosition: 'outside',
lineWidth: 1,
lineColor: '#A4A4A4',
min: 3,
title: {
text: "Доход от инвестиций",
margin: 10,
align: "low",
style: {
color: "#A4A4A4"
},
y: -50,
},
labels: {
enabled: false,
},
},
legend: {enabled: false},
marker: {
enabled: false,
symbol: 'circle',
radius: 12,
states: {
hover: {
fillColor: 'white',
lineColor: 'green',
lineWidth: 0
}
}
},
series: [
{
type: 'line',
name: "ВДело",
data: [0, 1100],
dataLabels: {
x: -100,
y: 5,
enabled: true,
// useHTML: true,
format: `{point.y}/мес`,
formatter: function () {
return Highcharts.numberFormat(this.y,2);
},
color: "#3DC3FB",
style:{
fontSize: 20,
lineHeight: 18,
fontWeight: 500,
fontFamily: 'Gilroy',
fontStyle: 'normal',
}
},
animation: {
defer: 1
},
marker: {
symbol: 'circle',
radius: 4,
states: {
hover: {
fillColor: '#3DC3FB',
lineColor: 'green',
lineWidth: 0
}
}
},
},
{
type: 'line',
name: "Акции",
data: [0, 550],
animation: {
defer: 1
},
marker: {
symbol: 'circle',
radius: 4,
states: {
hover: {
fillColor: '#FF5252',
lineColor: 'green',
lineWidth: 0
}
}
},
},
{
type: 'line',
name: "Облигации",
data: [0, 366],
animation: {
defer: 1
},
marker: {
symbol: 'circle',
radius: 4,
states: {
hover: {
fillColor: '#D2F449',
lineColor: 'green',
lineWidth: 0
}
}
},
},
{
type: 'line',
name: "Депозит",
data: [0, 275],
animation: {
defer: 1
},
marker: {
symbol: 'circle',
radius: 4,
states: {
hover: {
fillColor: '#179877',
lineColor: 'green',
lineWidth: 0
}
}
},
},
],
},
I am new to highcharts and have a hard time with huge documentation. help me please
Understood the cost of his sleep. For those who will be interested. So that the graph starts like in the picture.
plotOptions: {
series: {
findNearestPointBy: 'x',
label: {
connectorAllowed: false
},
pointPlacement: 'on'
}
}
and
{
type: 'line',
name: "ВДело",
data: [0, 1100],
dataLabels: {
x: -50,
y: -10,
enabled: true,
format: `{point.y}/мес`,
pointFormat: ' <b>{point.y:,.0f}/мес</b>',
shared: true,
color: "#3DC3FB",
style:{
fontSize: 20,
lineHeight: 18,
fontWeight: 500,
fontFamily: 'Gilroy',
fontStyle: 'normal',
}
},
When it comes to the place to start the chart in the category axis, you need to only change xAxis.min to 0.5
Sample code:
xAxis: {
min: 0.5,
tickmarkPlacement: 'on',
type: 'category'
},
Simplified demo:
https://jsfiddle.net/BlackLabel/jt1gqrnb/
Related
I'm using highcharts and have to divide a series, so the mouse over event focus on the correct data. But, when I divide the data, the space between horizontal series changes.
Highcharts one serie - before divide the data
Highcharts multiple series - after divide the data
I also have the two playgrounds on JSFiddle:
https://jsfiddle.net/6g09hjyk/
Highcharts.chart('container', {
chart: {
backgroundColor: 'transparent'
},
credits: false,
navigation: {
buttonOptions: {
theme: {
fill: 'white',
padding: 5,
stroke: 'none'
}
}
},
title: {
text: null
},
subtitle: {
},
xAxis: [{
visible: true,
offset: 0.1,
},
{
visible: false
}],
plotOptions: {
series: {
pointWidth: -5
}
},
yAxis: [{
visible: true,
reversed: true,
gridLineWidth: 0,
title: {
text: 'MD (m)',
style: {
fontSize: '10px'
}
},
min: 2000,
max: 6500
},
{
opposite: true,
gridLineWidth: 0,
title: {
text: null,
}
}
],
legend: {
enabled: false
},
series: [
{
showInLegend: false,
pointPlacement: 0,
animation: {
duration: 2000
},
pointWidth: 4,
type: 'columnrange',
inverted: false,
name: 'Revestimento',
color: 'grey',
dataLabels: {
enabled: true,
useHTML: true,
crop: false,
x: 0
},
data: [
[2001, 2057, 3455],
[2002, 2059, 5499],
[2003, 2055, 5838],
[2004, 2058, 6028],
[2007, 2058, 6028],
[2008, 2055, 5838],
[2009, 2059, 5499],
[2010, 2057, 3455]
]
}
]
});
https://jsfiddle.net/6g09hjyk/1/
Highcharts.chart('container', {
chart: {
backgroundColor: 'transparent'
},
credits: false,
navigation: {
buttonOptions: {
theme: {
fill: 'white',
padding: 5,
stroke: 'none'
}
}
},
title: {
text: null
},
subtitle: {
},
xAxis: [{
visible: true,
offset: 0.1,
},
{
visible: false
}],
plotOptions: {
series: {
pointWidth: -5
}
},
yAxis: [{
visible: true,
reversed: true,
gridLineWidth: 0,
title: {
text: 'MD (m)',
style: {
fontSize: '10px'
}
},
min: 2000,
max: 6500
},
{
opposite: true,
gridLineWidth: 0,
title: {
text: null,
}
}
],
legend: {
enabled: false
},
series: [
{
showInLegend: false,
pointPlacement: 0,
animation: {
duration: 2000
},
pointWidth: 4,
type: 'columnrange',
inverted: false,
name: 'Revestimento',
color: 'grey',
dataLabels: {
enabled: true,
useHTML: true,
crop: false,
x: 0
},
data: [
[2001, 2057, 3455],
[2010, 2057, 3455]
]
},
{
showInLegend: false,
pointPlacement: 0,
animation: {
duration: 2000
},
pointWidth: 4,
type: 'columnrange',
inverted: false,
name: 'Revestimento',
color: 'grey',
dataLabels: {
enabled: true,
useHTML: true,
crop: false,
x: 0
},
data: [
[2002, 2059, 5499],
[2009, 2059, 5499]]
},
{
showInLegend: false,
pointPlacement: 0,
animation: {
duration: 2000
},
pointWidth: 4,
type: 'columnrange',
inverted: false,
name: 'Revestimento',
color: 'grey',
dataLabels: {
enabled: true,
useHTML: true,
crop: false,
x: 0
},
data: [
[2003, 2055, 5838],
[2008, 2055, 5838],
]
},
{
showInLegend: false,
pointPlacement: 0,
animation: {
duration: 2000
},
pointWidth: 4,
type: 'columnrange',
inverted: false,
name: 'Revestimento',
color: 'grey',
dataLabels: {
enabled: true,
useHTML: true,
crop: false,
x: 0
},
data: [
[2004, 2058, 6028],
[2007, 2058, 6028],
]
}
]
});
Can anyone help me?
You need to disable the grouping feature:
plotOptions: {
series: {
...,
grouping: false
}
}
Live demo: https://jsfiddle.net/BlackLabel/rta5xs81/
API Reference: https://api.highcharts.com/highcharts/plotOptions.columnrange.grouping
I have a bunch of HighCharts running data from Google Sheets, and some of them firstly render the plot area then keep reloading the data on the chart, and I can't figure out why. Is this just a HighCharts thing, or something I can fix?
This is what's happening https://youtu.be/ddM-WxCAczM
This is the Google Sheet I'm loading into HighCharts cloud https://docs.google.com/spreadsheets/d/e/2PACX-1vSQEXUaZFqT3Oatl3AK8S-bqq6vNs5vDjoG2puaFvQ7LsSGB5dIaBk0Kp2aHWE2lbFEms9gZ6r36TTQ/pubhtml
Here's the custom code I'm applying in HighCharts cloud to render the chart how I need it:
Highcharts.merge(true, options, {
chart: {
height: 445,
marginTop: 70,
spacingBottom:-100,
style: {
fontFamily: '"Trebuchet MS","Trebuchet","Helvetica","Lucida Sans Unicode","Lucida Sans",Tahoma,sans-serif',
},
events: {
load: function () {
this.update({
exporting: {
filename: this.options.title.text,
}
});
}
},
plotBorderColorLeft: '#ccc',
plotBorderWidth: 0,
backgroundColor: {
stops: [
[1, 'rgb(255, 255, 255)'],
]
}
},
plotOptions: {
column: {
pointPlacement: 'between'
},
series: {
marker: {
enabled: false,
},
cursor: 'arrow'
}
},
yAxis: {
plotLines: [{
color: '#010101',
width: 2,
value: 0,
zIndex: 5
}],
lineWidth: 1.5,
gridLineWidth: 0,
lineColor: '#010101',
tickWidth: 1.5,
tickLength: 4,
tickColor: '#010101',
title: {
align: 'high',
offset: -10,
text: '(%)',
rotation: 0,
y: -12,
style: {
fontSize: '14px'
},
},
labels: {
enabled: true,
style: {
fontSize: '13px'
}
},
startOnTick: true,
endOnTick: true,
tickInterval: 1,
tickPosition: 'inside',
tickmarkPlacement: 'on',
},
xAxis: {
title: {
text: 'Date',
style: {
display: 'none'
}
},
offset:-127,
useHTML: true,
labels: {
enabled: true,
rotation: -90,
x: 14,
style: {
fontSize: '16px'
},
y:160
},
lineWidth:2,
lineColor: '#010101',
tickWidth:2,
tickPosition: 'inside',
tickLength:4,
tickColor: '#010101',
tickmarkPlacement: 'on',
startOnTick: false,
endOnTick: false,
min:.0,
max:40.4
},
credits: {
enabled:false
},
legend: {
symbolRadius: 0,
floating:true,
itemStyle: {
font: '14px Trebuchet MS, Trebuchet, "Helvetica", Verdana, sans-serif',
color: '#010101'
},
itemMarginTop: 5,
floating: true,
layout: 'vertical',
align: 'left',
verticalAlign: 'top',
enabled: true,
x: 50,
y: 15
},
subtitle: {
style: {
display: 'none'
},
y: 0
},
title: {
style: {
display: 'none'
},
y: 0
},
tooltip: {
valueSuffix: '%'
},
exporting: {
buttons: {
contextButton: {
enabled: true,
y:-10,
x:10,
text: 'Download',
menuItems: [
"printChart",
"separator",
"downloadPNG",
"downloadJPEG",
"downloadPDF",
"downloadSVG",
"separator",
"downloadCSV",
"downloadXLS",
{
textKey: 'viewData',
text: 'Toggle data table',
onclick: function() {
if (this.dataTableDiv && this.dataTableDiv.style.display !== 'none') {
this.dataTableDiv.style.display = 'none';
} else {
this.viewData();
this.dataTableDiv.style.display = '';
}
}
}
]
}
}
}
});
How do I keep both line points/markers in from splitting between the two bar charts but yet still have the ability to span both when values exceed initial bar value.
In the following example you will note that there are two line series that have the same values and thus I'm wanting the points/markers positioned one above the other but they are being split between the two stacked bars.
If you comment out the first bar series and plot options (see comments in code) you will see what I looking achieve but want the stacked bars rendered as well as have the second data value shown to the left.
My fiddle: https://jsfiddle.net/gbp5qvzh/58
var mychart = Highcharts.chart(
'container', {
chart: {
type: 'bar',
height: '400px'
},
title: {
text: null
},
xAxis: {
lineWidth: 0,
tickLength: 0,
opposite: false,
labels: {
enabled: false
}
},
yAxis: {
opposite: true,
gridLineWidth: 0,
title: {
enabled: false
},
labels: {
enabled: false
},
stackLabels: {
enabled: false,
formatter: function () {
return '<div class="barLabel">' + this.axis.chart.xAxis[0].categories[this.x] + '</div>';
},
useHTML: true,
verticalAlign: 'top',
align: 'left',
style: {
fontSize: '16px',
fontFamily: 'proxima-nova'
}
}
},
tooltip: {
enabled: false
},
legend: {
itemStyle: {
color: '#000000',
fontWeight: 'bold',
fontSize: '18px',
fontFamily: 'proxima-nova'
}
},
series: [
/** COMMENT 1 - START **/
{ type: 'bar',
name: 'background fller',
pointWidth: 50,
data: [6, 5, 7, 3, 6],
showInLegend: false,
animation: false,
color: '#dde8f2',
dataLabels: {
enabled: false
},
states: {
hover: {
enabled: false
}
}
},
/** COMMENT 1 - END **/
{ type: 'bar',
name: 'actual value',
pointWidth: 50,
data: [4, 5, 3, 7, 4],
showInLegend: false,
color: '#729bc3',
dataLabels: {
enabled: true,
align: 'left',
style: {
textOutline: false,
color: '#000000',
fontWeight: 'bold',
fontSize: '16px',
fontFamily: 'proxima-nova'
},
},
states: {
hover: {
enabled: false
}
}
}
],
/** COMMENT 2 - START **/
plotOptions: {
series: {
stacking: 'normal',
dataLabels: {
enabled: false
},
events: {
legendItemClick: function (e) {
e.preventDefault();
}
}
}
}
/** COMMENT 2 - END **/
});
mychart.addSeries({ type: 'line', name: 'Indicator1', lineWidth: 0,
data: [3.3, 2, 3, 6, 3], pointPlacement: 0.3, showInLegend: true,
dataLabels: { enabled: true, allowOverlap: true, verticalAlign: 'top', align: 'right', color: '#ff0000', style: { textOutline: false } },
marker: { symbol: 'circle', fillColor: '#ff0000' },
states: { hover: { enabled: false }, }
});
mychart.addSeries({ type: 'line', name: 'Indicator2', data: [3.3, 2, 3, 6, 3], pointPlacement: -0.3, showInLegend: true, dataLabels: { enabled: true, allowOverlap: true, verticalAlign: 'bottom', align: 'right', style: { textOutline: false }, x: 0, y: 0 }, lineWidth: 0, marker: { symbol: 'diamond', fillColor: '#000000' }, states: { hover: { enabled: false }, }
});
Currently you have both indicators in one stack group which makes the values in second indicator to add up with first one. If you want them to look like the second images in your question You should seperate their groups using stack: value option in their series. somthing like this: (note stack: 0 in indicator1 and stack: 1 in indicator2)
mychart.addSeries({ type: 'line', name: 'Indicator1', lineWidth: 0,
data: [3.3, 2, 3, 6, 3], stack : 0, pointPlacement: 0.3, showInLegend: true,
dataLabels: { enabled: true, allowOverlap: true, verticalAlign: 'top', align: 'right', color: '#ff0000', style: { textOutline: false } },
marker: { symbol: 'circle', fillColor: '#ff0000' },
states: { hover: { enabled: false }, }
});
mychart.addSeries({ type: 'line', name: 'Indicator2', data: [3.3, 2, 3, 6,
3],stack:1, pointPlacement: -0.3, showInLegend: true, dataLabels: { enabled: true,
allowOverlap: true, verticalAlign: 'bottom', align: 'right', style: { textOutline:
false }, x: 0, y: 0 }, lineWidth: 0, marker: { symbol: 'diamond', fillColor:
'#000000' }, states: { hover: { enabled: false }, }
JSFiddle: https://jsfiddle.net/3pfm8Laz/
API Reference: https://api.highcharts.com/highcharts/series.line.stack
I am using HighCharts to ploot some graph. I want my y-aixs to range between -1 to +1. When i set max=1 and min=-1 for y-axis, it does not work. Is there another way of implementing this. Below is the my code example.
$(opts.containerSelector).find('.chart-container').highcharts({
chart: {
events: {
load: loadLegendSelection
},
},
plotOptions: {
area: {
fillOpacity: 0.7
},
spline: {
marker: {
radius: 3
}
},
series: {
events: {
legendItemClick: storeLegendSelection
}
}
},
legend: {
},
loading: {
labelStyle: { "position": "relative", "top": "45%", "font-weight": "300", "color": "#29303a", "font-size": "22px" }
},
xAxis: {
gridLineDashStyle: 'dash',
gridLineColor: '#c2dce6',
gridLineWidth: 1,
min: minDate,
max: maxDate,
type: 'datetime',
labels: {
formatter: function() {
return formatTimestampTime(this.value);
}
},
events : {
afterSetExtremes : afterSetExtremes.bind(this, opts)
},
minRange: 3600 // one minute
},
yAxis: {
max: 1,
min: -1,
endOnTick: false,
gridLineDashStyle: 'dash',
gridLineColor: '#c2dce6',
gridLineWidth: 1,
labels: {
formatter: function() {
return formatMegawatts(this.value);
}
},
showFirstLabel: false,
title: ''
},
series: convertedData,
exporting: {
enabled: false
},
credits: {
enabled: false
},
tooltip: {
formatter:
function() {
return '<b>' + formatTimestampDateTimeWithSeconds(this.x) + '</b><br>' + formatMegawatts(this.y) + ' ('+ this.series.name + ')';
}
}
});
you can try setting min and max as given below.
yAxis: [{
max:1,
min: -1,
allowDecimals: false,
endOnTick: false,
gridLineWidth: 0,
labels: {
style: {
color: '#767676'
}
},
offset: -10,
title: {
text: 'Inv ' + val_qty,
"textAlign": 'top',
"rotation": 0,
x: 60,
y: yaxisVal,
style: {
color: '#767676',
fontWeight: 'bold'
}
}
}, {
allowDecimals: false,
min: 0,
endOnTick: false,
gridLineWidth: 0,
title: {
text: y2axisname,
"textAlign": 'top',
"rotation": 0,
x: -75,
y: yaxisVal,
style: {
color: '#767676',
fontWeight: 'bold'
}
},
offset: -10,
labels: {
format: '{value}',
style: {
color: '#767676'
}
},
opposite: true
}],
Is it possible to start the line from the hinges base ?
I have looked everywhere and couldnt find a solution for it
here is my code
jQuery('#chart').highcharts({
colors: ['#f5781e', '#7b3186'],
navigation: {
buttonOptions: {
enabled: false
}
},
credits: {
enabled: false
},
chart: {
type: 'line',
marginRight: 0,
marginBottom: 35,
width: 700,
height: 280,
},
title: {
text: '',
x: -20 //center
},
subtitle: {
text: '',
x: -20
},
xAxis: {
categories: ['1','2','3','4','5','6','7','8'],
alternateGridColor: '#f4f6f5',
lineColor: '#000000',
lineWidth: 1,
min: 0,
},
yAxis: {
title: {
text: ''
},
labels: {
useHTML : true,
format: '<span class="axis"><span class="flright">{value}</span>אלף</span>'
},
tickInterval: 3,
max: 35.2,
plotLines: [{
value: 1,
width: 1,
color: '#000'
}],
lineColor: '#000000',
lineWidth: 1,
min: 0
},
plotOptions: {
series: {
pointStart: 0
}
},
tooltip: {
crosshairs: {
width: 2,
color: 'gray',
dashStyle: 'shortdot'
},
animation: true,
valueSuffix: ',000₪',
backgroundColor: 'rgba(255, 255, 255, 0.8)',
formatter: function() {return '<b>₪' + this.x + this.y +'</b>';}
},
legend: {
enabled: false
/*****************
layout: 'horizontal',
align: 'center',
verticalAlign: 'bottom',
borderWidth: 0,
floating: true,
rtl: true,
y: 15,
margin: 10,
useHTML: true,
itemStyle: {
fontFamily: 'Arial, Helvetica, sans-serif',
fontWeight: 'bold'
}
*******************/
},
series: [
{
name: 'b',
data: [0.5,1,1.5,2,2.5,3,3.5,4]
},
{
name: '<span class="abc">a</span>',
data: [4,8,12,16,20,24,28,32]
}
]
},function(chart) { //LOGO
chart.renderer.image('/images/small_logo.png', 670, 18, 31, 23).add();
}
);
here is an image of what i want to achieve
You just have to change you min value :
xAxis: {
...
min: 0.5,
...
},
Look at this : http://jsfiddle.net/yKHsD/
EDIT :
There is a better solution. It is caused by the categories option. You can avoid this problem by doing :
var xCategories = ['1','2','3','4','5','6','7','8'];
// ...
xAxis: {
....
tickmarkPlacement: 'on',
labels: {
formatter: function() {
return xCategories[this.value];
}
},
startOnTick: false,
endOnTick: false,
minPadding: 0,
maxPadding: 0,
gridLineWidth: 1
},
In this example, don't forget to remove the categories option. Here is an example : http://jsfiddle.net/yKHsD/1/