JFreeChart CategoryPlot перезаписывает категории - PullRequest
1 голос
/ 20 апреля 2010

Я новичок в использовании JFreeChart и уверен, что есть простое решение моей проблемы. .

ПРОБЛЕМА:
У меня есть диаграмма, которая показывает несколько «типов событий» вдоль оси X даты. Ось Y показывает «категорию событий». Моя проблема в том, что для каждой категории отображается только самая последняя дата типа события.

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

Я думаю, что неправильно понимаю, как работает CategoryPlot. Я использую неправильный тип диаграммы? Я думал, что точечной диаграммой будет билет, но он принимает только числовые значения. Мне нужно иметь дискретные строковые категории на моей оси Y.

Если кто-нибудь может указать мне правильное направление, вы действительно сделаете мой день. Спасибо за чтение!

-Christine

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

import java.awt.Dimension;

import javax.swing.JPanel;

import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.time.Day;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;

public class EventFrequencyDemo1 extends ApplicationFrame   
{   
    public EventFrequencyDemo1(String s)   
    {   
        super(s);   
        CategoryDataset categorydataset = createDataset();   
        JFreeChart jfreechart = createChart(categorydataset);   
        ChartPanel chartpanel = new ChartPanel(jfreechart);   
        chartpanel.setPreferredSize(new Dimension(500, 270));   
        setContentPane(chartpanel);   
    }   

    private static JFreeChart createChart(CategoryDataset categorydataset)   
    {   
        CategoryPlot categoryplot = new CategoryPlot(categorydataset, new CategoryAxis("Category"), new DateAxis("Date"), new LineAndShapeRenderer(false, true));
        categoryplot.setOrientation(PlotOrientation.HORIZONTAL);
        categoryplot.setDomainGridlinesVisible(true);
        return new JFreeChart(categoryplot);   
    }   

    private static CategoryDataset createDataset()   
    {   
        DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset();   
        Day june10 = new Day(10, 6, 2002);   
        Day june20 = new Day(20, 6, 2002);
        // This event is overwritten by June20th
        defaultcategorydataset.setValue(new Long(june10.getMiddleMillisecond()), "Event Type 1", "Category 1");   
        defaultcategorydataset.setValue(new Long(june10.getMiddleMillisecond()), "Event Type 1", "Category 2");   
        // Overwrites the previous June10th event
        defaultcategorydataset.setValue(new Long(june20.getMiddleMillisecond()), "Event Type 1", "Category 1");   
        defaultcategorydataset.setValue(new Long(june20.getMiddleMillisecond()), "Event Type 2", "Category 2");   
        return defaultcategorydataset;   
    }   

    public static JPanel createDemoPanel()   
    {   
        JFreeChart jfreechart = createChart(createDataset());   
        return new ChartPanel(jfreechart);   
    }   

    public static void main(String args[])   
    {   
        EventFrequencyDemo1 eventfrequencydemo1 = new EventFrequencyDemo1("Event Frequency Demo");   
        eventfrequencydemo1.pack();   
        RefineryUtilities.centerFrameOnScreen(eventfrequencydemo1);   
        eventfrequencydemo1.setVisible(true);   
    }   
}  

Ответы [ 2 ]

1 голос
/ 21 апреля 2010

В дополнение к предложениям @Jeff Storey вы можете получить вдохновение от JFreeChart Samples и не пропустить приложение Demo , доступное через Java Web Start. Я не уверен, что следую вашим требованиям, но DefaultMultiValueCategoryDataset описывается как «Набор данных категории, который определяет несколько значений для каждого элемента.»

Приложение: Если вы хотите придерживаться LineAndShapeRenderer, то и LineAndShapeRenderer(false, true), и setBaseLinesVisible() могут помешать рисованию линий.

1 голос
/ 20 апреля 2010

Я думаю, что вы используете неправильный тип набора данных и диаграммы здесь. Похоже, вы пытаетесь создать график рассеяния, поэтому вам следует использовать график рассеяния вместо графика категории. На графике категории, потому что каждая пара строка / столбец получает только одно значение. Итак, при первом вызове вы говорите, что пара event1 / category1 имеет значение june10.getMiddleMillisecond, а затем вы меняете его значение на june20.getMiddleMillisecond. Вы также можете посмотреть графики временных рядов.

...