Labels on google charts are not visible in specific coonfiguration











up vote
1
down vote

favorite
1












I have chart configured like in working jsfiddle.
I have configured labels(basing on google doc documentation: https://developers.google.com/chart/interactive/docs/gallery/barchart#labeling-bars)
But they aren't visible. When I change chart type to google.visualization.BarChart, then labels appear but bars structure is destroyed. How to add labels to my configuration?



Replicated:
https://jsfiddle.net/41fmq37j/



JS:



google.charts.load('current', {'packages':['corechart', 'bar']});
google.charts.setOnLoadCallback(drawChart);
function drawChart() {
var data = google.visualization.arrayToDataTable([
[{label: 'Year', id: 'year', type: 'number'},
{label: 'Sales', id: 'Sales', type: 'number'},
{label: 'Expenses', id: 'Expenses', type: 'number'},
{ role: 'annotation' }],
[2014, 10, 400 ,'label1'],
[2014, 800, 100 ,'label2'],
[2015, 200, 460 ,'label3'],
[2015, 110, 660 ,'label4'],
[2016, 100, 300 ,'label5'],
[2016, 600, 120 ,'label6'],
[2017, 360, 540 ,'label7'],
[2017, 300, 500 ,'label8']
]);

var options = {
chart: {
title: 'Sales and Expenses',
subtitle: 'Some descr',
},
bars: 'horizontal',
height: 400,
isStacked: true,
};

var chart = new google.charts.Bar(document.getElementById('chart_div'));

chart.draw(data, google.charts.Bar.convertOptions(options));
}


HTML:



<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<div id="chart_div"></div>


EDIT:



It is possible to configure yAxis like below? Because current format can be confusing.
enter image description here



I would like to create more, a little different graphs, for example which will group bars by string. So another question is: how we can archive grouping yAxis by string? Maybe we should create any comparator?










share|improve this question




























    up vote
    1
    down vote

    favorite
    1












    I have chart configured like in working jsfiddle.
    I have configured labels(basing on google doc documentation: https://developers.google.com/chart/interactive/docs/gallery/barchart#labeling-bars)
    But they aren't visible. When I change chart type to google.visualization.BarChart, then labels appear but bars structure is destroyed. How to add labels to my configuration?



    Replicated:
    https://jsfiddle.net/41fmq37j/



    JS:



    google.charts.load('current', {'packages':['corechart', 'bar']});
    google.charts.setOnLoadCallback(drawChart);
    function drawChart() {
    var data = google.visualization.arrayToDataTable([
    [{label: 'Year', id: 'year', type: 'number'},
    {label: 'Sales', id: 'Sales', type: 'number'},
    {label: 'Expenses', id: 'Expenses', type: 'number'},
    { role: 'annotation' }],
    [2014, 10, 400 ,'label1'],
    [2014, 800, 100 ,'label2'],
    [2015, 200, 460 ,'label3'],
    [2015, 110, 660 ,'label4'],
    [2016, 100, 300 ,'label5'],
    [2016, 600, 120 ,'label6'],
    [2017, 360, 540 ,'label7'],
    [2017, 300, 500 ,'label8']
    ]);

    var options = {
    chart: {
    title: 'Sales and Expenses',
    subtitle: 'Some descr',
    },
    bars: 'horizontal',
    height: 400,
    isStacked: true,
    };

    var chart = new google.charts.Bar(document.getElementById('chart_div'));

    chart.draw(data, google.charts.Bar.convertOptions(options));
    }


    HTML:



    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
    <div id="chart_div"></div>


    EDIT:



    It is possible to configure yAxis like below? Because current format can be confusing.
    enter image description here



    I would like to create more, a little different graphs, for example which will group bars by string. So another question is: how we can archive grouping yAxis by string? Maybe we should create any comparator?










    share|improve this question


























      up vote
      1
      down vote

      favorite
      1









      up vote
      1
      down vote

      favorite
      1






      1





      I have chart configured like in working jsfiddle.
      I have configured labels(basing on google doc documentation: https://developers.google.com/chart/interactive/docs/gallery/barchart#labeling-bars)
      But they aren't visible. When I change chart type to google.visualization.BarChart, then labels appear but bars structure is destroyed. How to add labels to my configuration?



      Replicated:
      https://jsfiddle.net/41fmq37j/



      JS:



      google.charts.load('current', {'packages':['corechart', 'bar']});
      google.charts.setOnLoadCallback(drawChart);
      function drawChart() {
      var data = google.visualization.arrayToDataTable([
      [{label: 'Year', id: 'year', type: 'number'},
      {label: 'Sales', id: 'Sales', type: 'number'},
      {label: 'Expenses', id: 'Expenses', type: 'number'},
      { role: 'annotation' }],
      [2014, 10, 400 ,'label1'],
      [2014, 800, 100 ,'label2'],
      [2015, 200, 460 ,'label3'],
      [2015, 110, 660 ,'label4'],
      [2016, 100, 300 ,'label5'],
      [2016, 600, 120 ,'label6'],
      [2017, 360, 540 ,'label7'],
      [2017, 300, 500 ,'label8']
      ]);

      var options = {
      chart: {
      title: 'Sales and Expenses',
      subtitle: 'Some descr',
      },
      bars: 'horizontal',
      height: 400,
      isStacked: true,
      };

      var chart = new google.charts.Bar(document.getElementById('chart_div'));

      chart.draw(data, google.charts.Bar.convertOptions(options));
      }


      HTML:



      <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
      <div id="chart_div"></div>


      EDIT:



      It is possible to configure yAxis like below? Because current format can be confusing.
      enter image description here



      I would like to create more, a little different graphs, for example which will group bars by string. So another question is: how we can archive grouping yAxis by string? Maybe we should create any comparator?










      share|improve this question















      I have chart configured like in working jsfiddle.
      I have configured labels(basing on google doc documentation: https://developers.google.com/chart/interactive/docs/gallery/barchart#labeling-bars)
      But they aren't visible. When I change chart type to google.visualization.BarChart, then labels appear but bars structure is destroyed. How to add labels to my configuration?



      Replicated:
      https://jsfiddle.net/41fmq37j/



      JS:



      google.charts.load('current', {'packages':['corechart', 'bar']});
      google.charts.setOnLoadCallback(drawChart);
      function drawChart() {
      var data = google.visualization.arrayToDataTable([
      [{label: 'Year', id: 'year', type: 'number'},
      {label: 'Sales', id: 'Sales', type: 'number'},
      {label: 'Expenses', id: 'Expenses', type: 'number'},
      { role: 'annotation' }],
      [2014, 10, 400 ,'label1'],
      [2014, 800, 100 ,'label2'],
      [2015, 200, 460 ,'label3'],
      [2015, 110, 660 ,'label4'],
      [2016, 100, 300 ,'label5'],
      [2016, 600, 120 ,'label6'],
      [2017, 360, 540 ,'label7'],
      [2017, 300, 500 ,'label8']
      ]);

      var options = {
      chart: {
      title: 'Sales and Expenses',
      subtitle: 'Some descr',
      },
      bars: 'horizontal',
      height: 400,
      isStacked: true,
      };

      var chart = new google.charts.Bar(document.getElementById('chart_div'));

      chart.draw(data, google.charts.Bar.convertOptions(options));
      }


      HTML:



      <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
      <div id="chart_div"></div>


      EDIT:



      It is possible to configure yAxis like below? Because current format can be confusing.
      enter image description here



      I would like to create more, a little different graphs, for example which will group bars by string. So another question is: how we can archive grouping yAxis by string? Maybe we should create any comparator?







      javascript charts google-visualization label






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited yesterday

























      asked Nov 16 at 10:28









      CSource

      175




      175
























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          1
          down vote



          accepted










          material charts do not support columns roles, such as 'annotation',

          along with several other options



          and, it's not possible to have multiple stacks per label in classic charts



          as such, we can use a material chart,

          and add our own annotations manually,

          on the chart's 'ready' event



          see following working snippet...






          google.charts.load('current', {
          packages:['bar']
          }).then(function () {
          var data = google.visualization.arrayToDataTable([
          [
          {label: 'Year', id: 'year', type: 'number'},
          {label: 'Sales', id: 'Sales', type: 'number'},
          {label: 'Expenses', id: 'Expenses', type: 'number'},
          {role: 'annotation', type: 'string'}
          ],
          [2014, 10, 400, 'label1'],
          [2014, 800, 100, 'label2'],
          [2015, 200, 460, 'label3'],
          [2015, 110, 660, 'label4'],
          [2016, 100, 300, 'label5'],
          [2016, 600, 120, 'label6'],
          [2017, 360, 540, 'label7'],
          [2017, 300, 500, 'label8']
          ]);

          var options = {
          chart: {
          title: 'Sales and Expenses',
          subtitle: 'Some descr',
          },
          bars: 'horizontal',
          height: 400,
          isStacked: true,
          vAxis: {
          format: '0'
          }
          };

          var container = document.getElementById('chart_div');
          var chart = new google.charts.Bar(container);

          // add annotations
          google.visualization.events.addListener(chart, 'ready', function () {
          var annotation;
          var bars;
          var copyLabel;
          var coordsBar;
          var coordsLabel;
          var labels;
          var svg;

          // get svg
          svg = container.getElementsByTagName('svg')[0];

          // find label to clone
          labels = svg.getElementsByTagName('text');
          Array.prototype.forEach.call(labels, function(label) {
          if (label.textContent === data.getValue(0, 0).toString()) {
          copyLabel = label;
          }
          });

          // find top bars, add labels
          bars = svg.getElementsByTagName('path');
          Array.prototype.forEach.call(bars, function(bar, index) {
          coordsBar = bar.getBBox();
          annotation = copyLabel.parentNode.insertBefore(copyLabel.cloneNode(true), copyLabel);
          coordsLabel = annotation.getBBox();
          annotation.textContent = data.getValue(index, 3);
          annotation.setAttribute('fill', '#000000');
          annotation.setAttribute('x', coordsBar.x + coordsBar.width - 16);
          annotation.setAttribute('y', coordsBar.y + coordsBar.height - (coordsLabel.height / 2));
          annotation.style.zIndex = -1;
          });
          });

          chart.draw(data, google.charts.Bar.convertOptions(options));
          });

          <script src="https://www.gstatic.com/charts/loader.js"></script>
          <div id="chart_div"></div>







          EDIT



          the annotation script finds the first y-axis label,

          and uses it as a clone for the annotations.

          if the values for the y-axis change,

          then the script to find the label needs to change.



          updated here...



          // find label to clone
          labels = svg.getElementsByTagName('text');
          Array.prototype.forEach.call(labels, function(label) {
          // find first y-axis label
          if (label.textContent === formatDate.formatValue(data.getValue(0, 0))) {
          annotation = label;
          }
          });


          see following working snippet...






          google.charts.load('current', {
          packages:['bar']
          }).then(function () {
          var data = google.visualization.arrayToDataTable([
          [
          {label: 'Date', id: 'string', type:'date'},
          {label: 'Sales', id: 'Sales', type: 'number'},
          {label: 'Expenses', id: 'Expenses', type: 'number'},
          {role: 'annotation', type: 'string'}
          ],
          [new Date('2011-12-20'), 10, 400, 'User1'],
          [new Date('2011-12-20'), 800, 100, 'User2'],
          [new Date('2011-12-21'), 200, 460, 'User3'],
          [new Date('2011-12-21'), 200, 460, 'User3'],
          ]);

          var dateFormat = 'YYYY/MM/dd';

          var options = {
          chart: {
          title: 'Sales and Expenses',
          subtitle: 'Some descr',
          },
          bars: 'horizontal',
          height: 400,
          isStacked: true,
          vAxis: {
          format: dateFormat,

          }
          };

          var container = document.getElementById('chart_div');
          var chart = new google.charts.Bar(container);
          var formatDate = new google.visualization.DateFormat({
          pattern: dateFormat
          });

          // add annotations
          google.visualization.events.addListener(chart, 'ready', function () {
          var annotation;
          var bars;
          var copyLabel;
          var coordsBar;
          var coordsLabel;
          var labels;
          var svg;

          // get svg
          svg = container.getElementsByTagName('svg')[0];

          // find label to clone
          labels = svg.getElementsByTagName('text');
          Array.prototype.forEach.call(labels, function(label) {
          // find first y-axis label
          if (label.textContent === formatDate.formatValue(data.getValue(0, 0))) {
          copyLabel = label;
          }
          });

          // find top bars, add labels
          bars = svg.getElementsByTagName('path');
          Array.prototype.forEach.call(bars, function(bar, index) {
          coordsBar = bar.getBBox();
          annotation = copyLabel.parentNode.insertBefore(copyLabel.cloneNode(true), copyLabel);
          coordsLabel = annotation.getBBox();
          annotation.textContent = data.getValue(index, 3);
          annotation.setAttribute('fill', '#ffffff');
          annotation.setAttribute('text-anchor', 'start');
          annotation.setAttribute('x', coordsBar.x + coordsBar.width);
          annotation.setAttribute('y', coordsBar.y + (coordsBar.height / 2) + (coordsLabel.height / 2));
          annotation.style.zIndex = -1;
          });
          });

          chart.draw(data, google.charts.Bar.convertOptions(options));
          });

          <script src="https://www.gstatic.com/charts/loader.js"></script>
          <div id="chart_div"></div>








          share|improve this answer























          • You are awesome. It works. I accept your solution ofc but it has one disadvantage. When the tooltip is poping up then then the labels are on the top of them
            – CSource
            Nov 16 at 14:21










          • it is possible way to change it?
            – CSource
            Nov 16 at 14:33






          • 1




            changed answer above...
            – WhiteHat
            Nov 16 at 14:50










          • Thank you so much!! I have last question.. I do not know whats going on with grouping by dates/string. When I change values on yAxis to Date type, then grouping is ok, but 0 on yAxis displays.. when i change it to string, then groupins is destroying.. jsfiddle ->jsfiddle.net/wy7g4kdm It seems like only numbers were supported
            – CSource
            Nov 16 at 16:06








          • 1




            see EDIT above...
            – WhiteHat
            Nov 16 at 17:16











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














           

          draft saved


          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53335948%2flabels-on-google-charts-are-not-visible-in-specific-coonfiguration%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          up vote
          1
          down vote



          accepted










          material charts do not support columns roles, such as 'annotation',

          along with several other options



          and, it's not possible to have multiple stacks per label in classic charts



          as such, we can use a material chart,

          and add our own annotations manually,

          on the chart's 'ready' event



          see following working snippet...






          google.charts.load('current', {
          packages:['bar']
          }).then(function () {
          var data = google.visualization.arrayToDataTable([
          [
          {label: 'Year', id: 'year', type: 'number'},
          {label: 'Sales', id: 'Sales', type: 'number'},
          {label: 'Expenses', id: 'Expenses', type: 'number'},
          {role: 'annotation', type: 'string'}
          ],
          [2014, 10, 400, 'label1'],
          [2014, 800, 100, 'label2'],
          [2015, 200, 460, 'label3'],
          [2015, 110, 660, 'label4'],
          [2016, 100, 300, 'label5'],
          [2016, 600, 120, 'label6'],
          [2017, 360, 540, 'label7'],
          [2017, 300, 500, 'label8']
          ]);

          var options = {
          chart: {
          title: 'Sales and Expenses',
          subtitle: 'Some descr',
          },
          bars: 'horizontal',
          height: 400,
          isStacked: true,
          vAxis: {
          format: '0'
          }
          };

          var container = document.getElementById('chart_div');
          var chart = new google.charts.Bar(container);

          // add annotations
          google.visualization.events.addListener(chart, 'ready', function () {
          var annotation;
          var bars;
          var copyLabel;
          var coordsBar;
          var coordsLabel;
          var labels;
          var svg;

          // get svg
          svg = container.getElementsByTagName('svg')[0];

          // find label to clone
          labels = svg.getElementsByTagName('text');
          Array.prototype.forEach.call(labels, function(label) {
          if (label.textContent === data.getValue(0, 0).toString()) {
          copyLabel = label;
          }
          });

          // find top bars, add labels
          bars = svg.getElementsByTagName('path');
          Array.prototype.forEach.call(bars, function(bar, index) {
          coordsBar = bar.getBBox();
          annotation = copyLabel.parentNode.insertBefore(copyLabel.cloneNode(true), copyLabel);
          coordsLabel = annotation.getBBox();
          annotation.textContent = data.getValue(index, 3);
          annotation.setAttribute('fill', '#000000');
          annotation.setAttribute('x', coordsBar.x + coordsBar.width - 16);
          annotation.setAttribute('y', coordsBar.y + coordsBar.height - (coordsLabel.height / 2));
          annotation.style.zIndex = -1;
          });
          });

          chart.draw(data, google.charts.Bar.convertOptions(options));
          });

          <script src="https://www.gstatic.com/charts/loader.js"></script>
          <div id="chart_div"></div>







          EDIT



          the annotation script finds the first y-axis label,

          and uses it as a clone for the annotations.

          if the values for the y-axis change,

          then the script to find the label needs to change.



          updated here...



          // find label to clone
          labels = svg.getElementsByTagName('text');
          Array.prototype.forEach.call(labels, function(label) {
          // find first y-axis label
          if (label.textContent === formatDate.formatValue(data.getValue(0, 0))) {
          annotation = label;
          }
          });


          see following working snippet...






          google.charts.load('current', {
          packages:['bar']
          }).then(function () {
          var data = google.visualization.arrayToDataTable([
          [
          {label: 'Date', id: 'string', type:'date'},
          {label: 'Sales', id: 'Sales', type: 'number'},
          {label: 'Expenses', id: 'Expenses', type: 'number'},
          {role: 'annotation', type: 'string'}
          ],
          [new Date('2011-12-20'), 10, 400, 'User1'],
          [new Date('2011-12-20'), 800, 100, 'User2'],
          [new Date('2011-12-21'), 200, 460, 'User3'],
          [new Date('2011-12-21'), 200, 460, 'User3'],
          ]);

          var dateFormat = 'YYYY/MM/dd';

          var options = {
          chart: {
          title: 'Sales and Expenses',
          subtitle: 'Some descr',
          },
          bars: 'horizontal',
          height: 400,
          isStacked: true,
          vAxis: {
          format: dateFormat,

          }
          };

          var container = document.getElementById('chart_div');
          var chart = new google.charts.Bar(container);
          var formatDate = new google.visualization.DateFormat({
          pattern: dateFormat
          });

          // add annotations
          google.visualization.events.addListener(chart, 'ready', function () {
          var annotation;
          var bars;
          var copyLabel;
          var coordsBar;
          var coordsLabel;
          var labels;
          var svg;

          // get svg
          svg = container.getElementsByTagName('svg')[0];

          // find label to clone
          labels = svg.getElementsByTagName('text');
          Array.prototype.forEach.call(labels, function(label) {
          // find first y-axis label
          if (label.textContent === formatDate.formatValue(data.getValue(0, 0))) {
          copyLabel = label;
          }
          });

          // find top bars, add labels
          bars = svg.getElementsByTagName('path');
          Array.prototype.forEach.call(bars, function(bar, index) {
          coordsBar = bar.getBBox();
          annotation = copyLabel.parentNode.insertBefore(copyLabel.cloneNode(true), copyLabel);
          coordsLabel = annotation.getBBox();
          annotation.textContent = data.getValue(index, 3);
          annotation.setAttribute('fill', '#ffffff');
          annotation.setAttribute('text-anchor', 'start');
          annotation.setAttribute('x', coordsBar.x + coordsBar.width);
          annotation.setAttribute('y', coordsBar.y + (coordsBar.height / 2) + (coordsLabel.height / 2));
          annotation.style.zIndex = -1;
          });
          });

          chart.draw(data, google.charts.Bar.convertOptions(options));
          });

          <script src="https://www.gstatic.com/charts/loader.js"></script>
          <div id="chart_div"></div>








          share|improve this answer























          • You are awesome. It works. I accept your solution ofc but it has one disadvantage. When the tooltip is poping up then then the labels are on the top of them
            – CSource
            Nov 16 at 14:21










          • it is possible way to change it?
            – CSource
            Nov 16 at 14:33






          • 1




            changed answer above...
            – WhiteHat
            Nov 16 at 14:50










          • Thank you so much!! I have last question.. I do not know whats going on with grouping by dates/string. When I change values on yAxis to Date type, then grouping is ok, but 0 on yAxis displays.. when i change it to string, then groupins is destroying.. jsfiddle ->jsfiddle.net/wy7g4kdm It seems like only numbers were supported
            – CSource
            Nov 16 at 16:06








          • 1




            see EDIT above...
            – WhiteHat
            Nov 16 at 17:16















          up vote
          1
          down vote



          accepted










          material charts do not support columns roles, such as 'annotation',

          along with several other options



          and, it's not possible to have multiple stacks per label in classic charts



          as such, we can use a material chart,

          and add our own annotations manually,

          on the chart's 'ready' event



          see following working snippet...






          google.charts.load('current', {
          packages:['bar']
          }).then(function () {
          var data = google.visualization.arrayToDataTable([
          [
          {label: 'Year', id: 'year', type: 'number'},
          {label: 'Sales', id: 'Sales', type: 'number'},
          {label: 'Expenses', id: 'Expenses', type: 'number'},
          {role: 'annotation', type: 'string'}
          ],
          [2014, 10, 400, 'label1'],
          [2014, 800, 100, 'label2'],
          [2015, 200, 460, 'label3'],
          [2015, 110, 660, 'label4'],
          [2016, 100, 300, 'label5'],
          [2016, 600, 120, 'label6'],
          [2017, 360, 540, 'label7'],
          [2017, 300, 500, 'label8']
          ]);

          var options = {
          chart: {
          title: 'Sales and Expenses',
          subtitle: 'Some descr',
          },
          bars: 'horizontal',
          height: 400,
          isStacked: true,
          vAxis: {
          format: '0'
          }
          };

          var container = document.getElementById('chart_div');
          var chart = new google.charts.Bar(container);

          // add annotations
          google.visualization.events.addListener(chart, 'ready', function () {
          var annotation;
          var bars;
          var copyLabel;
          var coordsBar;
          var coordsLabel;
          var labels;
          var svg;

          // get svg
          svg = container.getElementsByTagName('svg')[0];

          // find label to clone
          labels = svg.getElementsByTagName('text');
          Array.prototype.forEach.call(labels, function(label) {
          if (label.textContent === data.getValue(0, 0).toString()) {
          copyLabel = label;
          }
          });

          // find top bars, add labels
          bars = svg.getElementsByTagName('path');
          Array.prototype.forEach.call(bars, function(bar, index) {
          coordsBar = bar.getBBox();
          annotation = copyLabel.parentNode.insertBefore(copyLabel.cloneNode(true), copyLabel);
          coordsLabel = annotation.getBBox();
          annotation.textContent = data.getValue(index, 3);
          annotation.setAttribute('fill', '#000000');
          annotation.setAttribute('x', coordsBar.x + coordsBar.width - 16);
          annotation.setAttribute('y', coordsBar.y + coordsBar.height - (coordsLabel.height / 2));
          annotation.style.zIndex = -1;
          });
          });

          chart.draw(data, google.charts.Bar.convertOptions(options));
          });

          <script src="https://www.gstatic.com/charts/loader.js"></script>
          <div id="chart_div"></div>







          EDIT



          the annotation script finds the first y-axis label,

          and uses it as a clone for the annotations.

          if the values for the y-axis change,

          then the script to find the label needs to change.



          updated here...



          // find label to clone
          labels = svg.getElementsByTagName('text');
          Array.prototype.forEach.call(labels, function(label) {
          // find first y-axis label
          if (label.textContent === formatDate.formatValue(data.getValue(0, 0))) {
          annotation = label;
          }
          });


          see following working snippet...






          google.charts.load('current', {
          packages:['bar']
          }).then(function () {
          var data = google.visualization.arrayToDataTable([
          [
          {label: 'Date', id: 'string', type:'date'},
          {label: 'Sales', id: 'Sales', type: 'number'},
          {label: 'Expenses', id: 'Expenses', type: 'number'},
          {role: 'annotation', type: 'string'}
          ],
          [new Date('2011-12-20'), 10, 400, 'User1'],
          [new Date('2011-12-20'), 800, 100, 'User2'],
          [new Date('2011-12-21'), 200, 460, 'User3'],
          [new Date('2011-12-21'), 200, 460, 'User3'],
          ]);

          var dateFormat = 'YYYY/MM/dd';

          var options = {
          chart: {
          title: 'Sales and Expenses',
          subtitle: 'Some descr',
          },
          bars: 'horizontal',
          height: 400,
          isStacked: true,
          vAxis: {
          format: dateFormat,

          }
          };

          var container = document.getElementById('chart_div');
          var chart = new google.charts.Bar(container);
          var formatDate = new google.visualization.DateFormat({
          pattern: dateFormat
          });

          // add annotations
          google.visualization.events.addListener(chart, 'ready', function () {
          var annotation;
          var bars;
          var copyLabel;
          var coordsBar;
          var coordsLabel;
          var labels;
          var svg;

          // get svg
          svg = container.getElementsByTagName('svg')[0];

          // find label to clone
          labels = svg.getElementsByTagName('text');
          Array.prototype.forEach.call(labels, function(label) {
          // find first y-axis label
          if (label.textContent === formatDate.formatValue(data.getValue(0, 0))) {
          copyLabel = label;
          }
          });

          // find top bars, add labels
          bars = svg.getElementsByTagName('path');
          Array.prototype.forEach.call(bars, function(bar, index) {
          coordsBar = bar.getBBox();
          annotation = copyLabel.parentNode.insertBefore(copyLabel.cloneNode(true), copyLabel);
          coordsLabel = annotation.getBBox();
          annotation.textContent = data.getValue(index, 3);
          annotation.setAttribute('fill', '#ffffff');
          annotation.setAttribute('text-anchor', 'start');
          annotation.setAttribute('x', coordsBar.x + coordsBar.width);
          annotation.setAttribute('y', coordsBar.y + (coordsBar.height / 2) + (coordsLabel.height / 2));
          annotation.style.zIndex = -1;
          });
          });

          chart.draw(data, google.charts.Bar.convertOptions(options));
          });

          <script src="https://www.gstatic.com/charts/loader.js"></script>
          <div id="chart_div"></div>








          share|improve this answer























          • You are awesome. It works. I accept your solution ofc but it has one disadvantage. When the tooltip is poping up then then the labels are on the top of them
            – CSource
            Nov 16 at 14:21










          • it is possible way to change it?
            – CSource
            Nov 16 at 14:33






          • 1




            changed answer above...
            – WhiteHat
            Nov 16 at 14:50










          • Thank you so much!! I have last question.. I do not know whats going on with grouping by dates/string. When I change values on yAxis to Date type, then grouping is ok, but 0 on yAxis displays.. when i change it to string, then groupins is destroying.. jsfiddle ->jsfiddle.net/wy7g4kdm It seems like only numbers were supported
            – CSource
            Nov 16 at 16:06








          • 1




            see EDIT above...
            – WhiteHat
            Nov 16 at 17:16













          up vote
          1
          down vote



          accepted







          up vote
          1
          down vote



          accepted






          material charts do not support columns roles, such as 'annotation',

          along with several other options



          and, it's not possible to have multiple stacks per label in classic charts



          as such, we can use a material chart,

          and add our own annotations manually,

          on the chart's 'ready' event



          see following working snippet...






          google.charts.load('current', {
          packages:['bar']
          }).then(function () {
          var data = google.visualization.arrayToDataTable([
          [
          {label: 'Year', id: 'year', type: 'number'},
          {label: 'Sales', id: 'Sales', type: 'number'},
          {label: 'Expenses', id: 'Expenses', type: 'number'},
          {role: 'annotation', type: 'string'}
          ],
          [2014, 10, 400, 'label1'],
          [2014, 800, 100, 'label2'],
          [2015, 200, 460, 'label3'],
          [2015, 110, 660, 'label4'],
          [2016, 100, 300, 'label5'],
          [2016, 600, 120, 'label6'],
          [2017, 360, 540, 'label7'],
          [2017, 300, 500, 'label8']
          ]);

          var options = {
          chart: {
          title: 'Sales and Expenses',
          subtitle: 'Some descr',
          },
          bars: 'horizontal',
          height: 400,
          isStacked: true,
          vAxis: {
          format: '0'
          }
          };

          var container = document.getElementById('chart_div');
          var chart = new google.charts.Bar(container);

          // add annotations
          google.visualization.events.addListener(chart, 'ready', function () {
          var annotation;
          var bars;
          var copyLabel;
          var coordsBar;
          var coordsLabel;
          var labels;
          var svg;

          // get svg
          svg = container.getElementsByTagName('svg')[0];

          // find label to clone
          labels = svg.getElementsByTagName('text');
          Array.prototype.forEach.call(labels, function(label) {
          if (label.textContent === data.getValue(0, 0).toString()) {
          copyLabel = label;
          }
          });

          // find top bars, add labels
          bars = svg.getElementsByTagName('path');
          Array.prototype.forEach.call(bars, function(bar, index) {
          coordsBar = bar.getBBox();
          annotation = copyLabel.parentNode.insertBefore(copyLabel.cloneNode(true), copyLabel);
          coordsLabel = annotation.getBBox();
          annotation.textContent = data.getValue(index, 3);
          annotation.setAttribute('fill', '#000000');
          annotation.setAttribute('x', coordsBar.x + coordsBar.width - 16);
          annotation.setAttribute('y', coordsBar.y + coordsBar.height - (coordsLabel.height / 2));
          annotation.style.zIndex = -1;
          });
          });

          chart.draw(data, google.charts.Bar.convertOptions(options));
          });

          <script src="https://www.gstatic.com/charts/loader.js"></script>
          <div id="chart_div"></div>







          EDIT



          the annotation script finds the first y-axis label,

          and uses it as a clone for the annotations.

          if the values for the y-axis change,

          then the script to find the label needs to change.



          updated here...



          // find label to clone
          labels = svg.getElementsByTagName('text');
          Array.prototype.forEach.call(labels, function(label) {
          // find first y-axis label
          if (label.textContent === formatDate.formatValue(data.getValue(0, 0))) {
          annotation = label;
          }
          });


          see following working snippet...






          google.charts.load('current', {
          packages:['bar']
          }).then(function () {
          var data = google.visualization.arrayToDataTable([
          [
          {label: 'Date', id: 'string', type:'date'},
          {label: 'Sales', id: 'Sales', type: 'number'},
          {label: 'Expenses', id: 'Expenses', type: 'number'},
          {role: 'annotation', type: 'string'}
          ],
          [new Date('2011-12-20'), 10, 400, 'User1'],
          [new Date('2011-12-20'), 800, 100, 'User2'],
          [new Date('2011-12-21'), 200, 460, 'User3'],
          [new Date('2011-12-21'), 200, 460, 'User3'],
          ]);

          var dateFormat = 'YYYY/MM/dd';

          var options = {
          chart: {
          title: 'Sales and Expenses',
          subtitle: 'Some descr',
          },
          bars: 'horizontal',
          height: 400,
          isStacked: true,
          vAxis: {
          format: dateFormat,

          }
          };

          var container = document.getElementById('chart_div');
          var chart = new google.charts.Bar(container);
          var formatDate = new google.visualization.DateFormat({
          pattern: dateFormat
          });

          // add annotations
          google.visualization.events.addListener(chart, 'ready', function () {
          var annotation;
          var bars;
          var copyLabel;
          var coordsBar;
          var coordsLabel;
          var labels;
          var svg;

          // get svg
          svg = container.getElementsByTagName('svg')[0];

          // find label to clone
          labels = svg.getElementsByTagName('text');
          Array.prototype.forEach.call(labels, function(label) {
          // find first y-axis label
          if (label.textContent === formatDate.formatValue(data.getValue(0, 0))) {
          copyLabel = label;
          }
          });

          // find top bars, add labels
          bars = svg.getElementsByTagName('path');
          Array.prototype.forEach.call(bars, function(bar, index) {
          coordsBar = bar.getBBox();
          annotation = copyLabel.parentNode.insertBefore(copyLabel.cloneNode(true), copyLabel);
          coordsLabel = annotation.getBBox();
          annotation.textContent = data.getValue(index, 3);
          annotation.setAttribute('fill', '#ffffff');
          annotation.setAttribute('text-anchor', 'start');
          annotation.setAttribute('x', coordsBar.x + coordsBar.width);
          annotation.setAttribute('y', coordsBar.y + (coordsBar.height / 2) + (coordsLabel.height / 2));
          annotation.style.zIndex = -1;
          });
          });

          chart.draw(data, google.charts.Bar.convertOptions(options));
          });

          <script src="https://www.gstatic.com/charts/loader.js"></script>
          <div id="chart_div"></div>








          share|improve this answer














          material charts do not support columns roles, such as 'annotation',

          along with several other options



          and, it's not possible to have multiple stacks per label in classic charts



          as such, we can use a material chart,

          and add our own annotations manually,

          on the chart's 'ready' event



          see following working snippet...






          google.charts.load('current', {
          packages:['bar']
          }).then(function () {
          var data = google.visualization.arrayToDataTable([
          [
          {label: 'Year', id: 'year', type: 'number'},
          {label: 'Sales', id: 'Sales', type: 'number'},
          {label: 'Expenses', id: 'Expenses', type: 'number'},
          {role: 'annotation', type: 'string'}
          ],
          [2014, 10, 400, 'label1'],
          [2014, 800, 100, 'label2'],
          [2015, 200, 460, 'label3'],
          [2015, 110, 660, 'label4'],
          [2016, 100, 300, 'label5'],
          [2016, 600, 120, 'label6'],
          [2017, 360, 540, 'label7'],
          [2017, 300, 500, 'label8']
          ]);

          var options = {
          chart: {
          title: 'Sales and Expenses',
          subtitle: 'Some descr',
          },
          bars: 'horizontal',
          height: 400,
          isStacked: true,
          vAxis: {
          format: '0'
          }
          };

          var container = document.getElementById('chart_div');
          var chart = new google.charts.Bar(container);

          // add annotations
          google.visualization.events.addListener(chart, 'ready', function () {
          var annotation;
          var bars;
          var copyLabel;
          var coordsBar;
          var coordsLabel;
          var labels;
          var svg;

          // get svg
          svg = container.getElementsByTagName('svg')[0];

          // find label to clone
          labels = svg.getElementsByTagName('text');
          Array.prototype.forEach.call(labels, function(label) {
          if (label.textContent === data.getValue(0, 0).toString()) {
          copyLabel = label;
          }
          });

          // find top bars, add labels
          bars = svg.getElementsByTagName('path');
          Array.prototype.forEach.call(bars, function(bar, index) {
          coordsBar = bar.getBBox();
          annotation = copyLabel.parentNode.insertBefore(copyLabel.cloneNode(true), copyLabel);
          coordsLabel = annotation.getBBox();
          annotation.textContent = data.getValue(index, 3);
          annotation.setAttribute('fill', '#000000');
          annotation.setAttribute('x', coordsBar.x + coordsBar.width - 16);
          annotation.setAttribute('y', coordsBar.y + coordsBar.height - (coordsLabel.height / 2));
          annotation.style.zIndex = -1;
          });
          });

          chart.draw(data, google.charts.Bar.convertOptions(options));
          });

          <script src="https://www.gstatic.com/charts/loader.js"></script>
          <div id="chart_div"></div>







          EDIT



          the annotation script finds the first y-axis label,

          and uses it as a clone for the annotations.

          if the values for the y-axis change,

          then the script to find the label needs to change.



          updated here...



          // find label to clone
          labels = svg.getElementsByTagName('text');
          Array.prototype.forEach.call(labels, function(label) {
          // find first y-axis label
          if (label.textContent === formatDate.formatValue(data.getValue(0, 0))) {
          annotation = label;
          }
          });


          see following working snippet...






          google.charts.load('current', {
          packages:['bar']
          }).then(function () {
          var data = google.visualization.arrayToDataTable([
          [
          {label: 'Date', id: 'string', type:'date'},
          {label: 'Sales', id: 'Sales', type: 'number'},
          {label: 'Expenses', id: 'Expenses', type: 'number'},
          {role: 'annotation', type: 'string'}
          ],
          [new Date('2011-12-20'), 10, 400, 'User1'],
          [new Date('2011-12-20'), 800, 100, 'User2'],
          [new Date('2011-12-21'), 200, 460, 'User3'],
          [new Date('2011-12-21'), 200, 460, 'User3'],
          ]);

          var dateFormat = 'YYYY/MM/dd';

          var options = {
          chart: {
          title: 'Sales and Expenses',
          subtitle: 'Some descr',
          },
          bars: 'horizontal',
          height: 400,
          isStacked: true,
          vAxis: {
          format: dateFormat,

          }
          };

          var container = document.getElementById('chart_div');
          var chart = new google.charts.Bar(container);
          var formatDate = new google.visualization.DateFormat({
          pattern: dateFormat
          });

          // add annotations
          google.visualization.events.addListener(chart, 'ready', function () {
          var annotation;
          var bars;
          var copyLabel;
          var coordsBar;
          var coordsLabel;
          var labels;
          var svg;

          // get svg
          svg = container.getElementsByTagName('svg')[0];

          // find label to clone
          labels = svg.getElementsByTagName('text');
          Array.prototype.forEach.call(labels, function(label) {
          // find first y-axis label
          if (label.textContent === formatDate.formatValue(data.getValue(0, 0))) {
          copyLabel = label;
          }
          });

          // find top bars, add labels
          bars = svg.getElementsByTagName('path');
          Array.prototype.forEach.call(bars, function(bar, index) {
          coordsBar = bar.getBBox();
          annotation = copyLabel.parentNode.insertBefore(copyLabel.cloneNode(true), copyLabel);
          coordsLabel = annotation.getBBox();
          annotation.textContent = data.getValue(index, 3);
          annotation.setAttribute('fill', '#ffffff');
          annotation.setAttribute('text-anchor', 'start');
          annotation.setAttribute('x', coordsBar.x + coordsBar.width);
          annotation.setAttribute('y', coordsBar.y + (coordsBar.height / 2) + (coordsLabel.height / 2));
          annotation.style.zIndex = -1;
          });
          });

          chart.draw(data, google.charts.Bar.convertOptions(options));
          });

          <script src="https://www.gstatic.com/charts/loader.js"></script>
          <div id="chart_div"></div>








          google.charts.load('current', {
          packages:['bar']
          }).then(function () {
          var data = google.visualization.arrayToDataTable([
          [
          {label: 'Year', id: 'year', type: 'number'},
          {label: 'Sales', id: 'Sales', type: 'number'},
          {label: 'Expenses', id: 'Expenses', type: 'number'},
          {role: 'annotation', type: 'string'}
          ],
          [2014, 10, 400, 'label1'],
          [2014, 800, 100, 'label2'],
          [2015, 200, 460, 'label3'],
          [2015, 110, 660, 'label4'],
          [2016, 100, 300, 'label5'],
          [2016, 600, 120, 'label6'],
          [2017, 360, 540, 'label7'],
          [2017, 300, 500, 'label8']
          ]);

          var options = {
          chart: {
          title: 'Sales and Expenses',
          subtitle: 'Some descr',
          },
          bars: 'horizontal',
          height: 400,
          isStacked: true,
          vAxis: {
          format: '0'
          }
          };

          var container = document.getElementById('chart_div');
          var chart = new google.charts.Bar(container);

          // add annotations
          google.visualization.events.addListener(chart, 'ready', function () {
          var annotation;
          var bars;
          var copyLabel;
          var coordsBar;
          var coordsLabel;
          var labels;
          var svg;

          // get svg
          svg = container.getElementsByTagName('svg')[0];

          // find label to clone
          labels = svg.getElementsByTagName('text');
          Array.prototype.forEach.call(labels, function(label) {
          if (label.textContent === data.getValue(0, 0).toString()) {
          copyLabel = label;
          }
          });

          // find top bars, add labels
          bars = svg.getElementsByTagName('path');
          Array.prototype.forEach.call(bars, function(bar, index) {
          coordsBar = bar.getBBox();
          annotation = copyLabel.parentNode.insertBefore(copyLabel.cloneNode(true), copyLabel);
          coordsLabel = annotation.getBBox();
          annotation.textContent = data.getValue(index, 3);
          annotation.setAttribute('fill', '#000000');
          annotation.setAttribute('x', coordsBar.x + coordsBar.width - 16);
          annotation.setAttribute('y', coordsBar.y + coordsBar.height - (coordsLabel.height / 2));
          annotation.style.zIndex = -1;
          });
          });

          chart.draw(data, google.charts.Bar.convertOptions(options));
          });

          <script src="https://www.gstatic.com/charts/loader.js"></script>
          <div id="chart_div"></div>





          google.charts.load('current', {
          packages:['bar']
          }).then(function () {
          var data = google.visualization.arrayToDataTable([
          [
          {label: 'Year', id: 'year', type: 'number'},
          {label: 'Sales', id: 'Sales', type: 'number'},
          {label: 'Expenses', id: 'Expenses', type: 'number'},
          {role: 'annotation', type: 'string'}
          ],
          [2014, 10, 400, 'label1'],
          [2014, 800, 100, 'label2'],
          [2015, 200, 460, 'label3'],
          [2015, 110, 660, 'label4'],
          [2016, 100, 300, 'label5'],
          [2016, 600, 120, 'label6'],
          [2017, 360, 540, 'label7'],
          [2017, 300, 500, 'label8']
          ]);

          var options = {
          chart: {
          title: 'Sales and Expenses',
          subtitle: 'Some descr',
          },
          bars: 'horizontal',
          height: 400,
          isStacked: true,
          vAxis: {
          format: '0'
          }
          };

          var container = document.getElementById('chart_div');
          var chart = new google.charts.Bar(container);

          // add annotations
          google.visualization.events.addListener(chart, 'ready', function () {
          var annotation;
          var bars;
          var copyLabel;
          var coordsBar;
          var coordsLabel;
          var labels;
          var svg;

          // get svg
          svg = container.getElementsByTagName('svg')[0];

          // find label to clone
          labels = svg.getElementsByTagName('text');
          Array.prototype.forEach.call(labels, function(label) {
          if (label.textContent === data.getValue(0, 0).toString()) {
          copyLabel = label;
          }
          });

          // find top bars, add labels
          bars = svg.getElementsByTagName('path');
          Array.prototype.forEach.call(bars, function(bar, index) {
          coordsBar = bar.getBBox();
          annotation = copyLabel.parentNode.insertBefore(copyLabel.cloneNode(true), copyLabel);
          coordsLabel = annotation.getBBox();
          annotation.textContent = data.getValue(index, 3);
          annotation.setAttribute('fill', '#000000');
          annotation.setAttribute('x', coordsBar.x + coordsBar.width - 16);
          annotation.setAttribute('y', coordsBar.y + coordsBar.height - (coordsLabel.height / 2));
          annotation.style.zIndex = -1;
          });
          });

          chart.draw(data, google.charts.Bar.convertOptions(options));
          });

          <script src="https://www.gstatic.com/charts/loader.js"></script>
          <div id="chart_div"></div>





          google.charts.load('current', {
          packages:['bar']
          }).then(function () {
          var data = google.visualization.arrayToDataTable([
          [
          {label: 'Date', id: 'string', type:'date'},
          {label: 'Sales', id: 'Sales', type: 'number'},
          {label: 'Expenses', id: 'Expenses', type: 'number'},
          {role: 'annotation', type: 'string'}
          ],
          [new Date('2011-12-20'), 10, 400, 'User1'],
          [new Date('2011-12-20'), 800, 100, 'User2'],
          [new Date('2011-12-21'), 200, 460, 'User3'],
          [new Date('2011-12-21'), 200, 460, 'User3'],
          ]);

          var dateFormat = 'YYYY/MM/dd';

          var options = {
          chart: {
          title: 'Sales and Expenses',
          subtitle: 'Some descr',
          },
          bars: 'horizontal',
          height: 400,
          isStacked: true,
          vAxis: {
          format: dateFormat,

          }
          };

          var container = document.getElementById('chart_div');
          var chart = new google.charts.Bar(container);
          var formatDate = new google.visualization.DateFormat({
          pattern: dateFormat
          });

          // add annotations
          google.visualization.events.addListener(chart, 'ready', function () {
          var annotation;
          var bars;
          var copyLabel;
          var coordsBar;
          var coordsLabel;
          var labels;
          var svg;

          // get svg
          svg = container.getElementsByTagName('svg')[0];

          // find label to clone
          labels = svg.getElementsByTagName('text');
          Array.prototype.forEach.call(labels, function(label) {
          // find first y-axis label
          if (label.textContent === formatDate.formatValue(data.getValue(0, 0))) {
          copyLabel = label;
          }
          });

          // find top bars, add labels
          bars = svg.getElementsByTagName('path');
          Array.prototype.forEach.call(bars, function(bar, index) {
          coordsBar = bar.getBBox();
          annotation = copyLabel.parentNode.insertBefore(copyLabel.cloneNode(true), copyLabel);
          coordsLabel = annotation.getBBox();
          annotation.textContent = data.getValue(index, 3);
          annotation.setAttribute('fill', '#ffffff');
          annotation.setAttribute('text-anchor', 'start');
          annotation.setAttribute('x', coordsBar.x + coordsBar.width);
          annotation.setAttribute('y', coordsBar.y + (coordsBar.height / 2) + (coordsLabel.height / 2));
          annotation.style.zIndex = -1;
          });
          });

          chart.draw(data, google.charts.Bar.convertOptions(options));
          });

          <script src="https://www.gstatic.com/charts/loader.js"></script>
          <div id="chart_div"></div>





          google.charts.load('current', {
          packages:['bar']
          }).then(function () {
          var data = google.visualization.arrayToDataTable([
          [
          {label: 'Date', id: 'string', type:'date'},
          {label: 'Sales', id: 'Sales', type: 'number'},
          {label: 'Expenses', id: 'Expenses', type: 'number'},
          {role: 'annotation', type: 'string'}
          ],
          [new Date('2011-12-20'), 10, 400, 'User1'],
          [new Date('2011-12-20'), 800, 100, 'User2'],
          [new Date('2011-12-21'), 200, 460, 'User3'],
          [new Date('2011-12-21'), 200, 460, 'User3'],
          ]);

          var dateFormat = 'YYYY/MM/dd';

          var options = {
          chart: {
          title: 'Sales and Expenses',
          subtitle: 'Some descr',
          },
          bars: 'horizontal',
          height: 400,
          isStacked: true,
          vAxis: {
          format: dateFormat,

          }
          };

          var container = document.getElementById('chart_div');
          var chart = new google.charts.Bar(container);
          var formatDate = new google.visualization.DateFormat({
          pattern: dateFormat
          });

          // add annotations
          google.visualization.events.addListener(chart, 'ready', function () {
          var annotation;
          var bars;
          var copyLabel;
          var coordsBar;
          var coordsLabel;
          var labels;
          var svg;

          // get svg
          svg = container.getElementsByTagName('svg')[0];

          // find label to clone
          labels = svg.getElementsByTagName('text');
          Array.prototype.forEach.call(labels, function(label) {
          // find first y-axis label
          if (label.textContent === formatDate.formatValue(data.getValue(0, 0))) {
          copyLabel = label;
          }
          });

          // find top bars, add labels
          bars = svg.getElementsByTagName('path');
          Array.prototype.forEach.call(bars, function(bar, index) {
          coordsBar = bar.getBBox();
          annotation = copyLabel.parentNode.insertBefore(copyLabel.cloneNode(true), copyLabel);
          coordsLabel = annotation.getBBox();
          annotation.textContent = data.getValue(index, 3);
          annotation.setAttribute('fill', '#ffffff');
          annotation.setAttribute('text-anchor', 'start');
          annotation.setAttribute('x', coordsBar.x + coordsBar.width);
          annotation.setAttribute('y', coordsBar.y + (coordsBar.height / 2) + (coordsLabel.height / 2));
          annotation.style.zIndex = -1;
          });
          });

          chart.draw(data, google.charts.Bar.convertOptions(options));
          });

          <script src="https://www.gstatic.com/charts/loader.js"></script>
          <div id="chart_div"></div>






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Nov 16 at 17:15

























          answered Nov 16 at 13:23









          WhiteHat

          34.7k51375




          34.7k51375












          • You are awesome. It works. I accept your solution ofc but it has one disadvantage. When the tooltip is poping up then then the labels are on the top of them
            – CSource
            Nov 16 at 14:21










          • it is possible way to change it?
            – CSource
            Nov 16 at 14:33






          • 1




            changed answer above...
            – WhiteHat
            Nov 16 at 14:50










          • Thank you so much!! I have last question.. I do not know whats going on with grouping by dates/string. When I change values on yAxis to Date type, then grouping is ok, but 0 on yAxis displays.. when i change it to string, then groupins is destroying.. jsfiddle ->jsfiddle.net/wy7g4kdm It seems like only numbers were supported
            – CSource
            Nov 16 at 16:06








          • 1




            see EDIT above...
            – WhiteHat
            Nov 16 at 17:16


















          • You are awesome. It works. I accept your solution ofc but it has one disadvantage. When the tooltip is poping up then then the labels are on the top of them
            – CSource
            Nov 16 at 14:21










          • it is possible way to change it?
            – CSource
            Nov 16 at 14:33






          • 1




            changed answer above...
            – WhiteHat
            Nov 16 at 14:50










          • Thank you so much!! I have last question.. I do not know whats going on with grouping by dates/string. When I change values on yAxis to Date type, then grouping is ok, but 0 on yAxis displays.. when i change it to string, then groupins is destroying.. jsfiddle ->jsfiddle.net/wy7g4kdm It seems like only numbers were supported
            – CSource
            Nov 16 at 16:06








          • 1




            see EDIT above...
            – WhiteHat
            Nov 16 at 17:16
















          You are awesome. It works. I accept your solution ofc but it has one disadvantage. When the tooltip is poping up then then the labels are on the top of them
          – CSource
          Nov 16 at 14:21




          You are awesome. It works. I accept your solution ofc but it has one disadvantage. When the tooltip is poping up then then the labels are on the top of them
          – CSource
          Nov 16 at 14:21












          it is possible way to change it?
          – CSource
          Nov 16 at 14:33




          it is possible way to change it?
          – CSource
          Nov 16 at 14:33




          1




          1




          changed answer above...
          – WhiteHat
          Nov 16 at 14:50




          changed answer above...
          – WhiteHat
          Nov 16 at 14:50












          Thank you so much!! I have last question.. I do not know whats going on with grouping by dates/string. When I change values on yAxis to Date type, then grouping is ok, but 0 on yAxis displays.. when i change it to string, then groupins is destroying.. jsfiddle ->jsfiddle.net/wy7g4kdm It seems like only numbers were supported
          – CSource
          Nov 16 at 16:06






          Thank you so much!! I have last question.. I do not know whats going on with grouping by dates/string. When I change values on yAxis to Date type, then grouping is ok, but 0 on yAxis displays.. when i change it to string, then groupins is destroying.. jsfiddle ->jsfiddle.net/wy7g4kdm It seems like only numbers were supported
          – CSource
          Nov 16 at 16:06






          1




          1




          see EDIT above...
          – WhiteHat
          Nov 16 at 17:16




          see EDIT above...
          – WhiteHat
          Nov 16 at 17:16


















           

          draft saved


          draft discarded



















































           


          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53335948%2flabels-on-google-charts-are-not-visible-in-specific-coonfiguration%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Can a sorcerer learn a 5th-level spell early by creating spell slots using the Font of Magic feature?

          Does disintegrating a polymorphed enemy still kill it after the 2018 errata?

          A Topological Invariant for $pi_3(U(n))$