JFreeChart DateTickUnit не работает должным образом - PullRequest
1 голос
/ 21 февраля 2012

Я даю пользователю возможность изменения для фильтрации результатов графика. Например, пользователь может выбрать отображение результатов за 2 дня. Тогда TimeUnitType - это день, timeAmount - 2. Но это не работает должным образом. Для этого случая это должно быть только 2 толстых единицы. Дата, относящаяся к первому дню, должна быть указана в соответствующей единице отметки. Другие данные, относящиеся ко второму дню, должны быть указаны во второй толстой единице.

Например, по умолчанию выбран 1 день. Он показывает черную линию под осью домена.

Domain Axis view

Я выбираю 1-месячный интервал. Домен Axis не показывает толстый.

    private void customizeGraphView(JFreeChart chart, TimeUnitType timeUnit, Integer timeAmount) {
    CombinedRangeXYPlot combinedPlot = (CombinedRangeXYPlot) chart.getPlot();
    @SuppressWarnings("unchecked")
    /** read 2 subplot*/
    List<XYPlot> subPlots = combinedPlot.getSubplots();
    for (int plotIndex = 0; plotIndex < subPlots.size(); plotIndex++) {
        /** get plot */
        XYPlot plot = subPlots.get(plotIndex);
        plot.setDomainGridlinesVisible(false);
        // plot.setRangeGridlinesVisible(false);
        XYItemRenderer itemRenderer = plot.getRenderer();
        /** if line and shape rendere */
        if (itemRenderer instanceof StandardXYItemRenderer) {
            StandardXYItemRenderer renderer = (StandardXYItemRenderer) itemRenderer;
            /** show shapes in time series */
            renderer.setBaseShapesVisible(true);
            /** fill shapes in time series */
            renderer.setBaseShapesFilled(true);
            renderer.setBaseFillPaint(Color.BLACK);
            // addItemLabels(renderer);
        }
        /** change DateAxis specific vaues */
        DateAxis dateAxis = (DateAxis) plot.getDomainAxis();
        /** change Date Axis Time Unit format */
        dateAxis.setTickLabelsVisible(true);
        /** add severity bar */
        if (plotIndex == 0) {
            dateAxis.setAutoRange(true);
            if(getFirstGraphMinRange() != null && getFirstGraphMaxRange() != null)
            {
                dateAxis.setRange(getHistoryGraphMinRange(), getHistoryGraphMaxRange());
                dateAxis.setTickUnit(new DateTickUnit(getTickUnitType(timeUnit), timeAmount));
            }
        } else {
            dateAxis.setDateFormatOverride(new SimpleDateFormat("HH:mm", Locale.getDefault()));
            dateAxis.setRange(getSecondGraphMinRange(), getSecondGraphMaxRange());
            dateAxis.setTickUnit(new DateTickUnit(DateTickUnitType.MINUTE, 5));
        }
    }

}

    /**
 * @param timeUnit
 * @return
 */
private DateTickUnitType getTickUnitType(TimeUnitType timeUnit) {
    DateTickUnitType unitType = null;
    switch (timeUnit) {
    case HOUR:
        unitType = DateTickUnitType.HOUR;
    break;
    case DAY:
        unitType = DateTickUnitType.DAY;
    break;
    case MONTH:
        unitType = DateTickUnitType.MONTH;
    break;
    default:
    break;
    }
    return unitType;
}

1 Ответ

2 голосов
/ 21 февраля 2012

Трудно найти проблему с тем, что вы опубликовали, поскольку есть другие параметры, которые могут повлиять на это поведение.

Например, если вы используете временную шкалу, которая исключает некоторые даты, она может объяснить, почему выне вижу клещейНапример, если вы используете отметку в 1 месяц и временную шкалу, исключающую воскресенье, все месяцы, начавшиеся в воскресенье, будут , а не .Вы можете попробовать использовать временную шкалу, которая включает все даты, чтобы увидеть, если проблема все еще происходит.

РЕДАКТИРОВАТЬ

На основе ваших комментариев вы пытаетесь установить галочкудо 4 дней с графиком, который имеет диапазон дат в несколько часов.Я не уверен, каково ожидаемое поведение такого сеута.Если я скопирую эти параметры на таком графике, я не вижу никаких отметок на оси даты.Если вместо этого установить тиковый блок на 10 минут (например), я смогу снова увидеть тики.

Я полагаю, что вывод состоит в том, что тиковый блок должен быть достаточно гранулированным, чтобы на графике был хотя бы 1 тикчтобы убедиться, что он виден (другими словами, длительность между 2 галочками должна быть меньше диапазона дат).

Если вы хотите больше контроля на оси домена, вы можете предпочесть использовать пользовательский NumberAxisвместо DateAxis (см. здесь , например).

...