【问题标题】:Google Material Bar Chart not drawing bars proportionally谷歌材料条形图没有按比例绘制条形图
【发布时间】:2020-08-20 01:53:32
【问题描述】:

我正在开发一个非常基本的表格/图表生成器,以显示电子运动队的赛季记录。 表格和图表都是用数据生成的,但是正在绘制的图表似乎没有按比例绘制条形。

IE 值为 3 的条小于值为 7 的条,但大于值为 14 的条,如链接图像所示(还不够酷,无法发布)

https://media.discordapp.net/attachments/172054778652786690/745815655764459570/unknown.png

我已经为 hAxis 设置了最小值、最大值和绘制方向,还尝试设置了网格线基线和计数,但都无济于事。

这里是独立函数:

            function drawChart(){
                jQuery.getJSON("https://spreadsheets.google.com/feeds/list/17PBCZMmVsSBiXV1-9f3KAfrpa_znstFRYM7GGvR_ps0/2/public/full?alt=json", function (data) {
                    const chartData = data.feed.entry;
                    const selectedSeason = document.getElementById('selectSeason').value;
                    let array = [];
                    let i;
                    for (i = 0; i < chartData.length; i++) {
                        let season = data.feed.entry[i]['gsx$season']['$t'];
                        let type = data.feed.entry[i]['gsx$type']['$t'];
                        let count = data.feed.entry[i]['gsx$count']['$t'];
                        if(selectedSeason === season){
                            array.push({type: type, count: count})
                        }
                    }
                    console.log(array);
                    let calArray = function(){
                        let rArray = [['Statistic', 'Count']];
                        for (let h = 0; h < array.length; h++){
                            rArray.push([array[h].type,array[h].count]);
                        }
                        return rArray
                    }
                    let chartArray = new google.visualization.arrayToDataTable(
                     calArray()
                    );
                    let chartOptions = {
                        animation: {
                            duration: 2.5,
                            startup: true,
                        },
                        bars: 'horizontal',
                        colors: ['#8040bf', '#8040bf', '#8040bf'],                      
                        chart: {
                            title: 'Phoenix Rising Amethyst',
                            subtitle: 'Season '+selectedSeason+' Record'
                        },
                        hAxis: {
                            direction: 1,
                            maxValue: 30,
                            minValue: 0,
                        },
                    };
                    let barChart = new google.charts.Bar(document.getElementById('chart_div'));
                    barChart.draw(chartArray, chartOptions);
                });
            };

这是整个 HTML 文档供参考。

<!DOCTYPE html>
<html>
    <head>
        <link rel="stylesheet" href="RosterTable.css">
        <script src="http://code.jquery.com/jquery-3.4.1.min.js"></script>
        <script src="http://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
        <script src="https://www.gstatic.com/charts/loader.js"></script>
        <script>
            google.charts.load('current', {'packages':['corechart', 'bar']});
        </script>
    </head>
    <body onload="generateTable(); drawChart()">
        <H2 align="center">Season Records</H2>
        <hr align="center">
        <br>
        <div>
        <p align="center">Select Season</p>
        <select id="selectSeason" align="center" onchange="clearTable(); generateTable(); drawChart()">
                <option value="9">9</option>
                <option value="10">10</option>
                <option value="11">11</option>
                <option value="12">12</option>
                <option value="13">13</option>
                <option value="14">14</option>
                <option value="15">15</option>
                <option value="16">16</option>
                <option value="17">17</option>
                <option value="18">18</option>
                <option value="19">19</option>
                <option value="20">20</option>
                <option value="21">21</option>
                <option value="22">22</option>
                <option value="23">23</option>
                <option value="24">24</option>
                <option value="25">25</option>
            </select>
        </div>
        <br>
        <script type="text/javascript">
            function generateTable() {
                jQuery.getJSON("https://spreadsheets.google.com/feeds/list/17PBCZMmVsSBiXV1-9f3KAfrpa_znstFRYM7GGvR_ps0/2/public/full?alt=json", function (data) {
                    const sheetData = data.feed.entry;
                    const selectedSeason = document.getElementById('selectSeason').value;
                    let i;
                    for (i = 0; i < sheetData.length; i++) {
                        let season = data.feed.entry[i]['gsx$season']['$t'];
                        let type = data.feed.entry[i]['gsx$type']['$t'];
                        let count = data.feed.entry[i]['gsx$count']['$t'];
                        if(selectedSeason === season){
                            document.getElementById("autoTableBody").innerHTML += ("<tr>"+"<td class='roster_td_odd_all'>"+type+"</td>"+"<td class='roster_td_odd_all'>"+count+"</td>"+"</tr>");
                        }
                    }
                });
            };
            function clearTable(){
                document.getElementById("autoTableBody").innerHTML = "";
            };

            function drawChart(){
                jQuery.getJSON("https://spreadsheets.google.com/feeds/list/17PBCZMmVsSBiXV1-9f3KAfrpa_znstFRYM7GGvR_ps0/2/public/full?alt=json", function (data) {
                    const chartData = data.feed.entry;
                    const selectedSeason = document.getElementById('selectSeason').value;
                    let array = [];
                    let i;
                    for (i = 0; i < chartData.length; i++) {
                        let season = data.feed.entry[i]['gsx$season']['$t'];
                        let type = data.feed.entry[i]['gsx$type']['$t'];
                        let count = data.feed.entry[i]['gsx$count']['$t'];
                        if(selectedSeason === season){
                            array.push({type: type, count: count})
                        }
                    }
                    console.log(array);
                    let calArray = function(){
                        let rArray = [['Statistic', 'Count']];
                        for (let h = 0; h < array.length; h++){
                            rArray.push([array[h].type,array[h].count]);
                        }
                        return rArray
                    }
                    let chartArray = new google.visualization.arrayToDataTable(
                     calArray()
                    );
                    let chartOptions = {
                        animation: {
                            duration: 2.5,
                            startup: true,
                        },
                        bars: 'horizontal',
                        colors: ['#8040bf', '#8040bf', '#8040bf'],                      
                        chart: {
                            title: 'Phoenix Rising Amethyst',
                            subtitle: 'Season '+selectedSeason+' Record'
                        },
                        hAxis: {
                            direction: 1,
                            maxValue: 30,
                            minValue: 0,
                        },
                    };
                    let barChart = new google.charts.Bar(document.getElementById('chart_div'));
                    barChart.draw(chartArray, chartOptions);
                });
            };
        </script>
        <div id="tableDiv" class='table.div'>
            <table>
                <thead>
                    <tr>
                        <th class='roster_th_all_pra'>Statistic</th>
                        <th class='roster_th_all_pra'>Count</th>
                    </tr>
                </thead>
                <tbody id="autoTableBody"/>
            </table>
        </div>
        <div id='chart_div'/>
    </body>
</html>

【问题讨论】:

    标签: javascript charts google-visualization


    【解决方案1】:

    当 y 轴值作为字符串而不是数字加载时会发生这种情况。

    确保您在此处使用parseFloatparseInt 加载数字...

    for (let h = 0; h < array.length; h++){
      rArray.push([array[h].type,parseFloat(array[h].count)]);
    }
    

    【讨论】:

    • calArray() 函数生成的数组只包含两列:第一列是字符串,第二列是整数。这会成为拦截器吗?
    • 对,第二列必须是数字,但它必须在 json 中作为字符串出现。多次看到这个。通过使用上面的解析方法很容易纠正。否则,请分享 --> console.log(JSON.stringify(array)); 的样本
    【解决方案2】:

    我认为

    hAxis = {
                    title: 'time', titleTextStyle: { color: '#FFF', fontSize:16 } , textStyle:{color: '#FFF'}
                    //, slantedText:true, slantedTextAngle:45
                    , gridlines: {
                        count: 5
                        , color: '#FFF'
                    }
                };
    

    使用的网格线

    【讨论】:

    • 虽然我提到过使用样式来声明 hAxis.gridlines.count 的值,但我在发布代码之前已将其删除,因为它没有解决我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多