Проблемы с гистограммой jqPlot
Я использую jqPlot для создания гистограммы, но я столкнулся с несколькими проблемами.
Проблема 1: Первая и последняя полосы на графике отключены. Только половина из них отображает
Проблема 2: Я не хочу, чтобы мои данные отображали всю ось x. Разве не нужно, чтобы данные охватывали всю ось X?
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
}
});
}
Ответы
Ответ 1
От того, как вы хотите, чтобы ваш сюжет выглядел, вы сэкономите массу неприятностей, если переключитесь на использование 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]()
Ответ 2
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 %#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);
Ответ 3
Вот простой хак, который я использовал для отображения поля.
Я создаю дату начала и дату окончания, которые являются соответственно за один день до и через один день после содержимого, которое я хочу показать.
Например, если я хочу показать январь 2012 года
var startingDate = new Date(2012, 0, 0); //=> 31th Dec 2011
var endingDate = new Date(2012, 1, 1); //=> 1st Feb 2012
Затем я объявляю свой собственный DateTickFormatter
, где я не буду печатать эти две даты.
$.jqplot.DateTickFormatter = function(format, val) {
if (!format) {
format = '%Y/%m/%d';
}
if(val==startingDate.getTime() || val==endingDate.getTime()){
return "";
}else{
return $.jsDate.strftime(val, format);
}
};
Затем в xaxis
поставьте следующие параметры:
xaxis : {
renderer:$.jqplot.DateAxisRenderer,
min:startingDate,
max:endingDate,
tickInterval:'1 day'
}