Question

Je suis nouveau à l'aide JFreeChart et je suis sûr qu'il ya une solution simple à mon problème. .

PROBLÈME: J'ai un tableau qui montre plusieurs « types d'événements » le long de l'axe X date. L'axe des Y montre la catégorie « événement ». Mon problème est que seule la dernière date d'un type d'événement est indiqué pour chaque catégorie.

Dans l'exemple ci-dessous Le graphique présente des points de données pour le type 1 événement à la 20th Juin (Catégorie 1) et à la 10e Juin (catégorie 2). J'avais aussi ajouté un point de données pour le 10 Juin, catégorie 1, mais le point du 20 Juin efface.

Je pense que je comprends mal comment le CategoryPlot fonctionne. Suis-je utiliser le mauvais type de graphique? Je pensais un diagramme de dispersion serait le ticket mais il accepte que des valeurs numériques. Je dois avoir des catégories de cordes discrètes sur mon axe Y.

Si quelqu'un peut me diriger dans la bonne direction, vous ferait vraiment ma journée. Merci d'avoir lu!

-Christine

(Le code ci-dessous fonctionne en l'état. Il est aussi simple que je pouvais le faire)

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);   
    }   
}  
Était-ce utile?

La solution

En plus des suggestions de Storey @ Jeff, vous pouvez vous inspirer des jfreechart échantillons , et ne négligez pas l'application Demo , disponible via Java Web Start. Je ne suis pas sûr que je suis à vos besoins, mais DefaultMultiValueCategoryDataset est décrit comme « un ensemble de données de catégorie qui définit des valeurs multiples pour chaque élément. »

Addendum: Si vous voulez coller avec LineAndShapeRenderer , à la fois LineAndShapeRenderer(false, true) et setBaseLinesVisible() peuvent empêcher dessin au trait.

Autres conseils

Je pense que vous utilisez le mauvais type de jeu de données et le graphique ici. Il semble que vous essayez de créer un nuage de points, de sorte que vous devriez utiliser le nuage de points au lieu d'une parcelle de catégorie. Dans la parcelle de la catégorie, parce que chaque paire ligne / colonne ne reçoit qu'une seule valeur. Ainsi, dans le premier appel, vous dites la event1 / paire de category1 a une valeur de june10.getMiddleMillisecond alors vous changez sa valeur à june20.getMiddleMillisecond. Vous pouvez également regarder les parcelles de séries chronologiques ainsi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top