2017-01-18 5 views
0

Googleタイムラインチャートのjavascriptコードがありますが、エラーを修正できません。

これ何のチャートを仮定すると、次のようになります。GoogleタイムラインチャートのJavascriptコードにエラーが含まれています

  1. バーの色はもちろん依存する(例えばIT)
  2. ツールチップは
  3. HAxisが
  4. HAxisがされるチャートの上に配置されたリンクを持っています

私は1-3が良いと思っていますが、@ WhiteHatの提案から#4を追加したときには、それが含まれています(例:10月6日から1週)。エラーです(下記のスニペットを参照してください)。
私はそれを無駄に修正しようとしました。
私のjavascriptは知識が限られており、初心者レベルです。

私はこの1つで私を助けてくれて、親切に私が間違っているところで私に説明してください。
アドバイスや提案は大変ありがとうございます。

ありがとうございます!


google.charts.load("current", {packages:["timeline"], callback: drawChart}); 
 

 
function drawChart() { 
 
var container = document.getElementById('chart_div'); 
 
var chart = new google.visualization.Timeline(container); 
 

 
// hAxis put on top 
 
google.visualization.events.addListener(chart, 'ready', afterDraw); 
 

 
// Link in tooltip 
 
google.visualization.events.addListener(chart, 'select', function(e) { 
 
    var tooltip = document.querySelector('.google-visualization-tooltip:not([clone])'); 
 
    if (chart.ttclone) { 
 
    chart.ttclone.parentNode.removeChild(chart.ttclone) 
 
    } 
 
    chart.ttclone = tooltip.cloneNode(true); 
 
    chart.ttclone.setAttribute('clone', true); 
 
    chart.ttclone.style.pointerEvents = 'auto'; 
 
    tooltip.parentNode.insertBefore(chart.ttclone, chart.tooltip); 
 
}); 
 

 
var dataTable = new google.visualization.DataTable(); 
 
dataTable.addColumn({ type: 'string', id: 'Name' }); 
 
// for colorMap 
 
dataTable.addColumn({ type: 'string', id: 'Course' }); 
 
dataTable.addColumn({ type: 'string', id: 'Subject' }); 
 
dataTable.addColumn({ type: 'string', id: 'ToolTip', role: 'tooltip', p:{html:true} }); 
 
dataTable.addColumn({ type: 'date', id: 'Start' }); 
 
dataTable.addColumn({ type: 'date', id: 'End' }); 
 
dataTable.addRows([ 
 
\t 
 
\t // Timeline Start 
 
\t ['Student 1', 'ENGR', 'Trigonometry', '<a href="link_to_subj_desc" target="_blank">Trigonometry</a>', new Date(2016, 9, 30), new Date(2016, 10, 06)], 
 
\t ['Student 2', 'IT', 'DB Management', '<a href="link_to_subj_desc" target="_blank">DB Management</a>', new Date(2016, 9, 30), new Date(2016, 10, 13)], 
 
\t ['Student 3', 'CS', 'Introduction to Programming', '<a href="link_to_subj_desc" target="_blank">Introduction to Programming</a>', new Date(2016, 9, 30), new Date(2016, 10, 27)], 
 
]); 
 
\t 
 
var colors = []; 
 
var colorMap = { 
 
\t ENGR: \t '#2ECC71', \t // Green 
 
\t IT: \t '#E67E22', \t // Brown 
 
\t CS: \t '#9B59B6', \t // Violet 
 
} 
 

 
for (var i = 0; i < dataTable.getNumberOfRows(); i++) { 
 
\t colors.push(colorMap[dataTable.getValue(i, 1)]); 
 
} 
 

 
var rowHeight = 41; 
 
var chartHeight = (dataTable.getNumberOfRows() + 1) * rowHeight; 
 
\t 
 
var options = { 
 
\t timeline: { 
 
\t \t groupByRowLabel: true, 
 
\t \t rowLabelStyle: { 
 
\t \t \t fontName: 'Century Gothic', 
 
\t \t \t fontSize: 14, 
 
\t \t \t color: '#333333', 
 
\t \t \t bold: 'true', 
 
\t \t }, 
 
\t \t barLabelStyle: { 
 
\t \t \t fontName: 'Century Gothic', 
 
fontSize: 11, 
 
}, 
 
showRowLabels: true, 
 
showBarLabels: true, 
 
}, 
 
hAxis: { 
 
minValue: new Date(2016, 9, 30), 
 
maxValue: new Date(2017, 9, 28), 
 
}, 
 
avoidOverlappingGridLines: true, 
 
height: chartHeight, 
 
width: '100%', 
 
colors: colors, 
 
}; 
 

 

 

 
// use a DataView to hide the category column from the Timeline 
 
var view = new google.visualization.DataView(dataTable); 
 
view.setColumns([0, 2, 3, 4, 5]); 
 

 
// Change HAxis labels to Week 
 
google.visualization.events.addListener(chart, 'ready', function() { 
 
    var rowIndex = 0;  // data table row index 
 
    var weekLabel = null; // clone of text node - keep font settings, y-coord, etc... 
 

 
    // remove haxis labels 
 
    var labels = container.getElementsByTagName('text'); 
 
    while (labels.length > dataTable.getNumberOfRows()) { 
 
    // ignore "category" labels 
 
    if (dataTable.getFilteredRows([{column: 5, value: labels[labels.length - 1].innerHTML}]).length === 0) { 
 
     if (weekLabel === null) { 
 
     weekLabel = labels[labels.length - 1].cloneNode(true); 
 
     } 
 
     labels[labels.length - 1].parentNode.removeChild(labels[labels.length - 1]); 
 
    } 
 
    } 
 

 
    
 

 
    // use timeline bars to find x coordinate for week labels 
 
    rowIndex = 0; 
 
     var svgParent = container.getElementsByTagName('svg')[0]; 
 
     Array.prototype.forEach.call(container.getElementsByTagName('rect'), function(bar) { 
 
     var bounds; // bounding box of text element 
 

 
     // ignore rect if not a timeline bar 
 
     if (parseFloat(bar.getAttribute('x')) > 0) { 
 
      weekLabel = weekLabel.cloneNode(true); 
 
      weekLabel.innerHTML = 'WW 70' + (rowIndex + 1); 
 
      svgParent.appendChild(weekLabel); 
 
      bounds = weekLabel.getBBox(); 
 
      weekLabel.setAttribute('x', parseFloat(bar.getAttribute('x')) + bounds.width); 
 
      rowIndex++; 
 
     } 
 
     }); 
 
    }); 
 
\t 
 
\t chart.draw(
 
\t \t view, 
 
\t \t options, 
 
\t \t dataTable, { 
 
\t \t \t tooltip: { 
 
\t \t \t \t isHtml: true, 
 
\t \t \t }, 
 
\t \t \t timeline: { 
 
\t \t \t \t showBarLabels: false, 
 
\t \t \t } 
 
\t }); 
 
} 
 

 
// hAxis put on top 
 
    function afterDraw() { 
 
\t var g = document.getElementsByTagName("svg")[0].getElementsByTagName("g")[1]; 
 
\t document.getElementsByTagName("svg")[0].parentNode.style.top = '40px'; 
 
\t document.getElementsByTagName("svg")[0].style.overflow = 'visible'; 
 
\t var height = Number(g.getElementsByTagName("text")[0].getAttribute('y')) + 15; 
 
\t g.setAttribute('transform','translate(0,-'+height+')'); 
 
\t g = null; 
 
}
<script src="https://www.gstatic.com/charts/loader.js"></script> 
 
<div id="chart_div"></div>

+0

こんにちは@WhiteHatを、それはあなたが前に私を提供してきたし、それが正常に動作しているものです。しかし問題はそれを一番上に置いて、それが私が問題を抱えているところです。それは可能ですか、あなたはこの1つで私を助けてくれますか? – bbb

+0

こんにちは、この人に私に助言できる人はいますか?前もって感謝します! – bbb

答えて

0

エラーが// remove haxis labels一部です。フィルタのvalueは「プログラミングの概要」(つまり、グラフの最後の<text>の内容)ですが、エラーの原因となる日付の列5をフィルタリングしています。

ラベルを変更するには、<svg>に行ってみる必要はありません(とにかく、ラベルはバーと一致しなくなるため、何も表示されません)。

はちょうどこの使用:

hAxis: { 
    minValue: new Date(2016, 9, 29), 
    maxValue: new Date(2016, 10, 28), 
}, 

google.charts.load("current", { 
 
    packages: ["timeline"], 
 
    callback: drawChart 
 
}); 
 

 
function drawChart() { 
 
    var container = document.getElementById('chart_div'); 
 
    var chart = new google.visualization.Timeline(container); 
 

 
    // hAxis put on top 
 
    google.visualization.events.addListener(chart, 'ready', afterDraw); 
 

 
    // Link in tooltip 
 
    google.visualization.events.addListener(chart, 'select', function(e) { 
 
    var tooltip = document.querySelector('.google-visualization-tooltip:not([clone])'); 
 
    if (chart.ttclone) { 
 
     chart.ttclone.parentNode.removeChild(chart.ttclone) 
 
    } 
 
    chart.ttclone = tooltip.cloneNode(true); 
 
    chart.ttclone.setAttribute('clone', true); 
 
    chart.ttclone.style.pointerEvents = 'auto'; 
 
    tooltip.parentNode.insertBefore(chart.ttclone, chart.tooltip); 
 
    }); 
 

 
    var dataTable = new google.visualization.DataTable(); 
 
    dataTable.addColumn({ 
 
    type: 'string', 
 
    id: 'Name' 
 
    }); 
 
    // for colorMap 
 
    dataTable.addColumn({ 
 
    type: 'string', 
 
    id: 'Course' 
 
    }); 
 
    dataTable.addColumn({ 
 
    type: 'string', 
 
    id: 'Subject' 
 
    }); 
 
    dataTable.addColumn({ 
 
    type: 'string', 
 
    id: 'ToolTip', 
 
    role: 'tooltip', 
 
    p: { 
 
     html: true 
 
    } 
 
    }); 
 
    dataTable.addColumn({ 
 
    type: 'date', 
 
    id: 'Start' 
 
    }); 
 
    dataTable.addColumn({ 
 
    type: 'date', 
 
    id: 'End' 
 
    }); 
 
    dataTable.addRows([ 
 

 
    // Timeline Start 
 
    ['Student 1', 'ENGR', 'Trigonometry', '<a href="link_to_subj_desc" target="_blank">Trigonometry</a>', new Date(2016, 9, 30), new Date(2016, 10, 06)], 
 
    ['Student 2', 'IT', 'DB Management', '<a href="link_to_subj_desc" target="_blank">DB Management</a>', new Date(2016, 9, 30), new Date(2016, 10, 13)], 
 
    ['Student 3', 'CS', 'Introduction to Programming', '<a href="link_to_subj_desc" target="_blank">Introduction to Programming</a>', new Date(2016, 9, 30), new Date(2016, 10, 27)] 
 
    ]); 
 

 
    var colors = []; 
 
    var colorMap = { 
 
    ENGR: '#2ECC71', // Green 
 
    IT: '#E67E22', // Brown 
 
    CS: '#9B59B6', // Violet 
 
    }; 
 

 
    for (var i = 0; i < dataTable.getNumberOfRows(); i++) { 
 
    colors.push(colorMap[dataTable.getValue(i, 1)]); 
 
    } 
 

 
    var rowHeight = 41; 
 
    var chartHeight = (dataTable.getNumberOfRows() + 1) * rowHeight; 
 

 
    var options = { 
 
    timeline: { 
 
     groupByRowLabel: true, 
 
     rowLabelStyle: { 
 
     fontName: 'Century Gothic', 
 
     fontSize: 14, 
 
     color: '#333333', 
 
     bold: 'true', 
 
     }, 
 
     barLabelStyle: { 
 
     fontName: 'Century Gothic', 
 
     fontSize: 11, 
 
     }, 
 
     showRowLabels: true, 
 
     showBarLabels: true, 
 
    }, 
 
    hAxis: { 
 
     minValue: new Date(2016, 9, 29), 
 
     maxValue: new Date(2016, 10, 28), 
 
    }, 
 
    avoidOverlappingGridLines: true, 
 
    height: chartHeight, 
 
    width: '100%', 
 
    colors: colors, 
 
    }; 
 

 

 

 
    // use a DataView to hide the category column from the Timeline 
 
    var view = new google.visualization.DataView(dataTable); 
 
    view.setColumns([0, 2, 3, 4, 5]); 
 

 
    chart.draw(
 
    view, 
 
    options, 
 
    dataTable, { 
 
     tooltip: { 
 
     isHtml: true, 
 
     }, 
 
     timeline: { 
 
     showBarLabels: false, 
 
     } 
 
    }); 
 
} 
 

 
// hAxis put on top 
 
function afterDraw() { 
 
    var g = document.getElementsByTagName("svg")[0].getElementsByTagName("g")[1]; 
 
    document.getElementsByTagName("svg")[0].parentNode.style.top = '40px'; 
 
    document.getElementsByTagName("svg")[0].style.overflow = 'visible'; 
 
    var height = Number(g.getElementsByTagName("text")[0].getAttribute('y')) + 15; 
 
    g.setAttribute('transform', 'translate(0,-' + height + ')'); 
 
    g = null; 
 
}
<script src="https://www.gstatic.com/charts/loader.js"></script> 
 
<div id="chart_div"></div>

+0

クイック返信のために@Chris Gに感謝します。しかし、私が必要とするのは、日付を文字列に変更することです。 (例は11月6日から1週目、11月13日から2週目などです)。 これは可能でしょうか? – bbb

関連する問題