1

私はいくつかの Google チャートを含むページを持っています。主にコンボ チャートと折れ線チャートです。例えば:

chart = new google.visualization.LineChart(chartDiv);

ページが既に描画された後、軸から最大値を読み取り、グラフを再描画して、すべての軸で同じ最大値を持つようにしたいと考えています (つまり、比較しやすくするため)。一見)。これらの最大値は事前にわかりません。

オプションを変更してチャートを再描画することができました

chart.draw(data, options)

しかし、軸からデータを引き出す方法がわかりません。チャート オブジェクトには、 .getChartLayoutInterface() これは有望に思えますが、使用方法がわかりません。たとえば、これは機能します:

var b = c.getChartLayoutInterface().getChartAreaBoundingBox();

しかし、

var b = c.getChartLayoutInterface().getVAxisValue();

戻りますnull

4

2 に答える 2

1

@Sjoerd に getChartLayoutInterface() がどのように機能するかを尋ねる必要があります。これは、オンラインにドキュメントがないように見えるためです。

それまでの間、作成している各グラフの最小値と最大値を取得し、すべてのグラフを組み合わせた最大/最小値の最大値と最小値を取得することができます。

これらの最大値/最小値を使用して、各チャートの最小値/最大値を手動で設定できます (適切な丸めを使用)。丸めをうまく行うには、次のことをお勧めします。

// Take the Max/Min of all data values in all graphs
var totalMax = 345;
var totalMin = -123;

// Figure out the largest number (positive or negative)
var biggestNumber = Math.max(Math.abs(totalMax),Math.abs(totalMin));

// Round to an exponent of 10 appropriate for the biggest number
var roundingExp = Math.floor(Math.log(biggestNumber) / Math.LN10);
var roundingDec = Math.pow(10,roundingExp);

// Round your max and min to the nearest exponent of 10
var newMax = Math.ceil(totalMax/roundingDec)*roundingDec;
var newMin = Math.floor(totalMin/roundingDec)*roundingDec;

// Determine the range of your values
var range = newMax - newMin;

// Define the number of gridlines (default 5)
var gridlines = 5;

// Determine an appropriate gap between gridlines
var interval = range / (gridlines - 1);

// Round that interval up to the exponent of 10
var newInterval = Math.ceil(interval/roundingDec)*roundingDec;

// Re-round your max and min to the new interval
var finalMax = Math.ceil(totalMax/newInterval)*newInterval;
var finalMin = Math.floor(totalMin/newInterval)*newInterval;

これは、Google が最大値/最小値を決定する方法と似ています (たとえば、値として -6.2 と 3.1 がある場合、使用する奇数であってもグリッド線に 3.1 を使用することがあります)。しかし、独自の丸めを作成することで、Google がどのように丸めるかを理解する必要がなくなります (これはトリッキーな命題です)。

よくわからない場合はお知らせください。

于 2013-01-11T01:53:51.223 に答える
0

ドキュメント関数によると getVAxisValue、次の署名があります。

getVAxisValue(position, optional_axis_index)

グラフ コンテナーの上端からのオフセットである位置の垂直方向の論理値を返します。負になる可能性があります。

例: chart.getChartLayoutInterface().getVAxisValue(300).

チャートが描画された後にこれを呼び出します。

返品の種類:number


あなたの目標は、軸から最大値を読み取ってから、グラフを再描画して、すべての軸で同じ最大値を持つようにすることであるため、次の解決策を提案します

の最小/最大値を計算するgoogle.visualization.DataTable:

function calcMinMax(data, colIndex)
{
   var totalMin  = data.getValue(0,colIndex);
   var totalMax = data.getValue(0,colIndex);
   for(var i = 0; i < data.getNumberOfRows();i++){
        if ( data.getValue(i, colIndex) < totalMin  ) {
          totalMin  = data.getValue(i, colIndex);
        }          
        if ( data.getValue(i, colIndex) > totalMax ) {
          totalMax = data.getValue(i, colIndex);
        }
   }
   return {'min': totalMin, 'max': totalMax };
} 

そしてオプションを設定しviewWindowます:

var vAxisMinMax = calcMinMax(data,1); 
options.vAxis = {'viewWindow': {'min': vAxisMinMax.min, 'max': vAxisMinMax.max}};

google.load('visualization', '1', { packages: ['corechart', 'line'] });
google.setOnLoadCallback(drawBasic);

function drawBasic() {

    var data = new google.visualization.DataTable();
    data.addColumn('number', 'X');
    data.addColumn('number', 'Dogs');

    data.addRows([
      [0, 5], [1, 10], [2, 23], [3, 17], [4, 18], [5, 9],
      [6, 11], [7, 27], [8, 33], [9, 40], [10, 32], [11, 35],
      [12, 30], [13, 40], [14, 42], [15, 47], [16, 44], [17, 48],
      [18, 52], [19, 54], [20, 42], [21, 55], [22, 56], [23, 57],
      [24, 60], [25, 50], [26, 52], [27, 51], [28, 49], [29, 53],
      [30, 55], [31, 60], [32, 61], [33, 59], [34, 62], [35, 65],
      [36, 62], [37, 58], [38, 55], [39, 61], [40, 64], [41, 65],
      [42, 63], [43, 66], [44, 67], [45, 69], [46, 69], [47, 70],
      [48, 72], [49, 68], [50, 66], [51, 65], [52, 67], [53, 70],
      [54, 71], [55, 72], [56, 73], [57, 75], [58, 70], [59, 68],
      [60, 64], [61, 60], [62, 65], [63, 67], [64, 68], [65, 69],
      [66, 70], [67, 72], [68, 75], [69, 80]
    ]);

    var options = {
        hAxis: {
            title: 'Time'
        },
        vAxis: {
            title: 'Popularity'
        }
    };

    var chart = new google.visualization.LineChart(document.getElementById('chart_div'));


    var vAxisMinMax = calcMinMax(data,1); 
    options.vAxis = {'viewWindow': {'min': vAxisMinMax.min, 'max': vAxisMinMax.max}};
   

    chart.draw(data, options);

    
}





function calcMinMax(data, colIndex)
{
   var totalMin  = data.getValue(0,colIndex);
   var totalMax = data.getValue(0,colIndex);
   for(var i = 0; i < data.getNumberOfRows();i++){
        if ( data.getValue(i, colIndex) < totalMin  ) {
          totalMin  = data.getValue(i, colIndex);
        }          
        if ( data.getValue(i, colIndex) > totalMax ) {
          totalMax = data.getValue(i, colIndex);
        }
   }
   return {'min': totalMin, 'max': totalMax };
}
<script type="text/javascript" src="https://www.google.com/jsapi"></script> 
<div id="chart_div"></div>

于 2015-10-04T14:25:32.617 に答える