【问题标题】:Google Chart API (not Visualization API): How to get rid of annotation lines谷歌图表 API(不是可视化 API):如何摆脱注释线
【发布时间】:2023-04-09 13:53:01
【问题描述】:

我正在尝试使用 Google Chart API 生成图表并将图表作为图像。请注意,我是在服务器端而不是在浏览器端呈现图表(即不使用 Google Visualization API)。

在我的一些图表中,我画了一条垂直线,代表一个目标。由于我所有不同的 x 值的目标都是相同的,我只需将其标记在我的图表顶部,如下图所示:

我可以设法只显示顶部标签,但是: - 如何删除小注释线?特别是当没有显示标签时! - 如何将此标签移动到行的顶部而不是右侧(到 防止与条形标签重叠,例如A = 95)? - 我怎样才能格式化这个独特的标签(即在一个带有背景颜色的框中设置文本)

这是我用来生成图表图像的代码:

var annotations = [0, 
                   1, {calc: "stringify", sourceColumn: 1, type: "string", role: "annotation"},
                   2, {calc: "stringify", sourceColumn: 3, type: "string", role: "annotation"}, 
                   ];

var dataViewDefinition = Charts.newDataViewDefinition().setColumns(annotations).build();

var data = Charts.newDataTable()
  .addColumn(Charts.ColumnType.STRING, 'x')
  .addColumn(Charts.ColumnType.NUMBER, 'act')
  .addColumn(Charts.ColumnType.NUMBER, 'tgt')
  .addColumn(Charts.ColumnType.STRING, 'tgt_lbl')
  .addRow(['A', 90, 95, '95'])
  .addRow(['B', 80, 95, ''])
  .addRow(['C', 100, 95, ''])
  .build();


  var chart = Charts.newBarChart()
    .setDataTable(data)
    .setRange(0, 150)
    .setOption('series', {
      1: { lineWidth: 1, type: 'line'}
    })
    .setOption('chartArea', {'width': '80%', 'height': '100%'})
    .setColors(['#D9D9D9', '#0085AD'])
    .setOption('annotations', { textStyle: { color: '#000000' }})
    .setDataViewDefinition(dataViewDefinition)
    .build();


  var folder=DriveApp.getFolderById('Folder ID');
  folder.createFile(chart.getAs('image/png')).setName('Image Name');

看到trick通过修改生成的SVG,在使用Visualization API的时候去掉注释行,但是在使用Chart API的时候怎么处理呢?

感谢您的帮助!

【问题讨论】:

    标签: google-apps-script charts google-visualization


    【解决方案1】:

    您可以尝试以下选项...

    .setOption('annotations.stem.color', 'transparent')
    

    或者……

    .setOption('annotations.stem.length', 0)
    

    【讨论】:

    • 谢谢@WhiteHat。它有帮助!与此同时,我发现 stem: { color: 'none'} 也可以。 Google 文档并不总是准确的!
    【解决方案2】:


    对于像上面这样的输出,我尝试了不同的方法:

    如果你仔细想想,95 目标不是一个数据系列,它是你所有系列通用的静态值。所以另一种方法是在代表目标的水平轴上设置一条垂直线(刻度线)。

    一个例子:

    function createDataView(){
      // Build a DataTable with data
      var data = Charts.newDataTable();
      data.addColumn(Charts.ColumnType.STRING, 'Domain / Series');
      data.addColumn(Charts.ColumnType.NUMBER, 'Sales');
      data.addRow(['A', 90]);
      data.addRow(['B', 80]);
      data.addRow(['C', 100]);
      data.build();
      return data
    }
    
    function chartDataTable(dataTable) {
      
      // Create a ChartBuilder with the data 
      var chartBuilder = Charts.newBarChart().setDataTable(dataTable);
      chartBuilder.setOption('title','My chart');
      chartBuilder.setOption('titleTextStyle',{ 
                                            'fontName': 'AudioWide',
                                            'fontSize': 16,
                                            'bold': true,
                                            'italic': false 
                                          });
      chartBuilder.setOption('hAxes', {0:{'title':'Sales in USD',
                                          'titleTextStyle':{ 
                                            'fontName': 'AudioWide',
                                            'fontSize': 14,
                                            'bold': true,
                                            'italic': false 
                                          },
                                          'ticks':[{
                                            'v':95, 
                                            'f':'Target 95$'
                                          }],
                                          'gridlines':{
                                            'color':'black',
                                            'count': 5
                                          },
                                          'minorGridlines':{
                                            'color':'grey',
                                            'count': 0
                                          },
                                          'textPosition':'out',
                                          'textStyle':{ 
                                            'fontName': 'AudioWide',
                                            'fontSize': 12,
                                            'color':'magenta',
                                            'bold': true,
                                            'italic': true 
                                          }
                                         },
                                       1:{}
                                      }
                            );
      chartBuilder.setOption('vAxes', {0:{'title':'Accounts',
                                          'titleTextStyle':{ 
                                            'fontName': 'AudioWide',
                                            'fontSize': 14,
                                            'bold': true,
                                            'italic': false 
                                          },
                                          'textPosition':'out'
                                         }
                                      }
                            );
      
      // Asign data series to axis
      chartBuilder.setOption('series', {
        0:{'targetAxisIndex':0},
        1:{'targetAxisIndex':0, 
           'visibleInLegend':false       
          }
      });
      
      // Asign a range for the chart
      chartBuilder.setRange(50,150);
      
      
      // Create the dataView we will use
      var dataView = Charts.newDataViewDefinition();
      
      // Create column Indexes for the Data view
      // indexes start at 0
      var calculated_col_obj = {
        calc: 'stringify',
        type: 'string',
        label: '',
        id: '',
        sourceColumn: 1,
        role: 'annotation',
      };
      
      var columnIndexes = [0,1,calculated_col_obj]; 
      
      // Build the data view with the column indexes we require
      dataView.setColumns(columnIndexes).build();
      
      // set the dataview for this chart
      chartBuilder.setDataViewDefinition(dataView)
      
      //  Build the chart
      var chart = chartBuilder.build();
      
      // save chart in Drive folder
      var folder=DriveApp.getFolderById('<YOUR-FOLDER-ID>');
      folder.createFile(chart.getAs('image/png')).setName('MyChartFromDataView');
    }
    

    最后:

    chartDataTable(createDataView())

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 2011-10-10
      • 2013-02-26
      • 1970-01-01
      相关资源
      最近更新 更多