在 google 个条形图中隐藏注释

Hide annotations in google bar chart

我正在显示一个基于 arrays.It 数组的 google 条形图,当前显示所有带有注释的值。我如何隐藏 0 值并在栏内显示注释并删除 stem.我正在使用的数据是动态的,所以最好是我可以创建函数来检查 0 并在数据视图中用 null 替换,但我仍然需要 stringify 来显示注释。

 <script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
res=[["Bob",80,0,0],["tom",0,60,0]]
google.charts.load("current", {packages:["corechart"]});
google.charts.setOnLoadCallback(drawChart);
function drawChart() {
tmp=[['Name','percent1','percent2','percent3']].concat(res)
console.log(tmp)
var data = google.visualization.arrayToDataTable(tmp);
var view = new google.visualization.DataView(data);
view.setColumns([0, 1,
                       { calc: "stringify",
                         sourceColumn: 1,
                         type: "string",
                         role: "annotation" },
                       2,
                       { calc: "stringify",
                         sourceColumn: 2,
                         type: "string",
                         role: "annotation" },
                        3,{ calc: "stringify",
                         sourceColumn: 3,
                         type: "string",
                         role: "annotation" },
                       ]);

var options = {
          chart: {
            title: chartTitle,
            
          },
          bars: 'horizontal',
          bar: {groupWidth: "95%"},
        };
var chart = new google.visualization.BarChart(document.getElementById(chartName));
chart.draw(view, options);

我们可以提供自己的函数,而不是使用 stringify 函数。
如果值为零,则 return 为空。如果 non-zero,return 格式化值...

  calc: function (dt, row) {
    var val = dt.getValue(row, 1);
    if (val !== 0) {
      return dt.getFormattedValue(row, 1);
    } else {
      return null;
    }
  },

对于系列列,相同,只是 return 实际值。
所以我们不包括列索引,而是使用相同的计算函数。

  calc: function (dt, row) {
    var val = dt.getValue(row, 1);
    if (val !== 0) {
      return val;
    } else {
      return null;
    }
  },
  type: data.getColumnType(1),
  label: data.getColumnLabel(1)

例如

var view = new google.visualization.DataView(data);
view.setColumns([0, {
  calc: function (dt, row) {
    var val = dt.getValue(row, 1);
    if (val !== 0) {
      return val;
    } else {
      return null;
    }
  },
  type: data.getColumnType(1),
  label: data.getColumnLabel(1)
}, {
  calc: function (dt, row) {
    var val = dt.getValue(row, 1);
    if (val !== 0) {
      return dt.getFormattedValue(row, 1);
    } else {
      return null;
    }
  },
  type: "string",
  role: "annotation"
}, {
  calc: function (dt, row) {
    var val = dt.getValue(row, 2);
    if (val !== 0) {
      return val;
    } else {
      return null;
    }
  },
  type: data.getColumnType(2),
  label: data.getColumnLabel(2)
}, {
  calc: function (dt, row) {
    var val = dt.getValue(row, 2);
    if (val !== 0) {
      return dt.getFormattedValue(row, 2);
    } else {
      return null;
    }
  },
  type: "string",
  role: "annotation"
}, {
  calc: function (dt, row) {
    var val = dt.getValue(row, 3);
    if (val !== 0) {
      return val;
    } else {
      return null;
    }
  },
  type: data.getColumnType(3),
  label: data.getColumnLabel(3)
}, {
  calc: function (dt, row) {
    var val = dt.getValue(row, 3);
    if (val !== 0) {
      return dt.getFormattedValue(row, 3);
    } else {
      return null;
    }
  },
  type: "string",
  role: "annotation"
}]);

如果您不想重复所有的列定义,
您可以根据数据中的列动态构建 table...

var columns = [0];
for (var i = 1; i < data.getNumberOfColumns(); i++) {
  addColumn(i);
}

var view = new google.visualization.DataView(data);
view.setColumns(columns);

function addColumn(index) {
  columns.push({
    calc: function (dt, row) {
      var val = dt.getValue(row, index);
      if (val !== 0) {
        return val;
      } else {
        return null;
      }
    },
    type: data.getColumnType(index),
    label: data.getColumnLabel(index)
  });
  columns.push({
    calc: function (dt, row) {
      var val = dt.getValue(row, index);
      if (val !== 0) {
        return dt.getFormattedValue(row, index);
      } else {
        return null;
      }
    },
    type: "string",
    role: "annotation"
  });
}