Возникли проблемы с гистограммой jqPlot - PullRequest
11 голосов
/ 30 января 2012

Я использую jqPlot для создания гистограммы, но столкнулся с несколькими проблемами.

Задача 1: Первый и последний столбцы на графике обрезаны.Только половина отображает

Проблема 2: Я не хочу, чтобы мои точки данных охватывали всю ось X.Разве там не должно быть данных, охватывающих всю ось X?

enter image description here ex: Это то, что происходит сейчас.

Это данные, которые я передаю в него

var chartData = [["19-Jan-2012",2.61],["20-Jan-2012",5.00],["21-Jan-2012",6.00]]

Это jquery, который я использую.

 // Plot chart
        function PlotChart(chartData, numberOfTicks) {
            $.jqplot.config.enablePlugins = true;
                 var plot2 = $.jqplot('chart1', [chartData], {
                    title: 'Mouse Cursor Tracking',
                     seriesDefaults:{
                         renderer: $.jqplot.BarRenderer,
                         rendererOptions: {
                            barPadding: 1,
                            barMargin: 15,
                            barDirection: 'vertical',
                            barWidth: 50
                        }, 
                        pointLabels: { show: true }
                    },
                    axes: {
                        xaxis: {
                            pad: 0,       // a factor multiplied by the data range on the axis to give the
                            numberTicks: numberOfTicks,
                            renderer:  $.jqplot.DateAxisRenderer,  // renderer to use to draw the axis,
                            tickOptions: {
                                formatString: '%b %#d'   // format string to use with the axis tick formatter
                            }
                        },
                        yaxis: {
                            tickOptions: {
                                formatString: '$%.2f'
                            }
                        }
                    },
                    highlighter: {
                        sizeAdjust: 7.5
                    },
                    cursor: {
                        show: true
                    }
                });
            }

Ответы [ 3 ]

21 голосов
/ 30 января 2012

От того, как вы хотите, чтобы ваш график выглядел, вы избавите себя от многих проблем, если переключитесь на использование CategoryAxisRenderer вместо DateAxisRenderer. CategoryAxisRenderer намного лучше отображает дискретные группы данных, чем истинные временные ряды.

var axisDates = ["Jan 19", "Jan 20", "Jan 21"]
var chartData = [2.61,5.00,6.00]

        $.jqplot.config.enablePlugins = true;
             var plot2 = $.jqplot('chart2', [chartData], {
                title: 'Some Plot',
                 seriesDefaults:{
                     renderer: $.jqplot.BarRenderer,
                     rendererOptions: {
                        barPadding: 1,
                        barMargin: 15,
                        barDirection: 'vertical',
                        barWidth: 50
                    }, 
                    pointLabels: { show: true }
                },
                axes: {
                    xaxis: {                            
                            renderer:  $.jqplot.CategoryAxisRenderer,
                            ticks: axisDates
                    },
                    yaxis: {
                        tickOptions: {
                            formatString: '$%.2f'
                        }
                    }
                },
                highlighter: {
                    sizeAdjust: 7.5
                },
                cursor: {
                    show: true
                }
            });

enter image description here

10 голосов
/ 30 января 2012

DateAxisRenderer действительно предназначен для линейных графиков, а не для гистограмм.Когда вы комбинируете это с гистограммами, это просто не работает правильно.Идея / цель DateAxisRenderer состоит в том, чтобы построить линейный / точный график времени по дате / времени.Таким образом, если вы пропустите запись даты, она все равно будет отображаться в масштабе с течением времени.Проверьте их примеры в DateAxisRenderer здесь: http://www.jqplot.com/tests/date-axes.php

То, что вы хотите использовать, это CategoryAxisRenderer.Затем вы можете просто переопределить / создать свой собственный рендерер меток и быть готовым к работе.Обычно вы не хотите добавлять дополнительные пустые элементы к элементу, особенно если они пустые, однако, если вы это сделаете, просто добавьте их в свой массив данных.

Вот jsfiddle, который делает то, что вы хотите:http://jsfiddle.net/fordlover49/JWhmQ/

Обратите внимание, что вы можете заглянуть в раздел управления ресурсами, чтобы проверить, какие файлы вам нужны (помимо файла jquery).

Вот javascript в случае jsfiddleдействует вверх:

$.jqplot.config.enablePlugins = true;
var chartData = [["19-Jan-2012", 2.61], ["20-Jan-2012", 5.00], ["21-Jan-2012", 6.00]];

// add a custom tick formatter, so that you don't have to include the entire date renderer library.
$.jqplot.DateTickFormatter = function(format, val) {
    // for some reason, format isn't being passed through properly, so just going to hard code for purpose of this jsfiddle
    val = (new Date(val)).getTime();
    format = '%b&nbsp%#d'
    return $.jsDate.strftime(val, format);
};

function PlotChart(chartData, extraDays) {
    // if you want extra days, just append them to your chartData array.
    if (typeof extraDays === "number") {
        for (var i = 0; i < extraDays; i++) {
            var actualDate = new Date(chartData[chartData.length - 1]); // convert last entry to actual date
            var newDate = new Date(actualDate.getFullYear(), actualDate.getMonth(), actualDate.getDate() + 1); // create new increased date
            chartData.push([newDate, 0]);
        }
    }

    var plot2 = $.jqplot('chart1', [chartData], {
        title: 'Mouse Cursor Tracking',
        seriesDefaults: {
            renderer: $.jqplot.BarRenderer,
            rendererOptions: {
                barPadding: 1,
                barWidth: 50
            },
            pointLabels: {
                show: true
            }
        },
        axes: {
            xaxis: {
                pad: 1,
                // a factor multiplied by the data range on the axis to give the            
                renderer: $.jqplot.CategoryAxisRenderer,
                // renderer to use to draw the axis,     
                tickOptions: {
                    formatString: '%b %#d',
                    formatter: $.jqplot.DateTickFormatter
                }
            },
            yaxis: {
                tickOptions: {
                    formatString: '$%.2f'
                }
            }
        },
        highlighter: {
            sizeAdjust: 7.5
        },
        cursor: {
            show: true
        }
    });
}

PlotChart(chartData, 3);
1 голос
/ 26 февраля 2013

Вот простой хак, который я использовал для показа поля.

Я создаю дату начала и дату окончания, соответственно, за один день до и один день после содержимого, которое я хочу показать.

Например, если я хочу показать январь 2012 года

var startingDate = new Date(2012, 0, 0); //=> 31th Dec 2011
var endingDate = new Date(2012, 1, 1); //=> 1st Feb 2012

Тогда я объявляю свое собственное DateTickFormatter, где я не буду распечатывать эти две даты.

* * 1010

Затем в xaxis я положил следующие параметры:

xaxis : {
      renderer:$.jqplot.DateAxisRenderer, 
      min:startingDate,
      max:endingDate,
      tickInterval:'1 day'
}
...