2009-09-26 6 views
0

J'essaie d'afficher des données sur un XYBarChart en utilisant JFreechart. Le graphique devrait afficher les points dans le temps avec un compte. Ainsi, si l'utilisateur choisit le 25 janvier et le 25 mars comme intervalle, le graphique devrait afficher les données entre ces dates dans certains intervalles:Comment puis-je dessiner un graphique avec un TimeSeries dans jfreecharts qui n'interpole pas les valeurs de date pour moi?

si l'utilisateur choisit HEURE, alors je crée une collection de toutes les heures du 25 jan au mars 10e, avec un nombre correspondant. Naturellement, c'est une assez grande collection. Si l'utilisateur choisit MONTH, l'utilisateur devrait voir 3 mois (et seulement 3 entrées dans la collection). Si l'utilisateur choisit DAY, l'utilisateur verra seulement environ 60 entrées. Tu vois? Lorsque je crée le graphique (en utilisant le code ci-dessous pour la génération de l'ensemble de données), il «interpole» les valeurs. Si je choisis des heures, il montre des données par jour avec beaucoup de barres entre chaque jour (c.-à-d., 24 petites barres pendant le jour). Si je choisis des mois, je reçois toujours les jours pendant 2 mois, mais je reçois un bloc géant qui couvre tous les jours du mois. Si je choisis le jour, ça a l'air bien.

Comment faire pour que jfreecharts arrête d'interpoler des valeurs et dessine simplement un graphique avec un mappage 1: 1 avec les données que je lui donne. Si je lui donne deux entrées pour 2 mois et lui donne une RegularTimePeriod de Month.class, montre seulement deux barres avec deux étiquettes et deux valeurs. Si je lui donne 1000 heures au cours de plusieurs mois, puis d'afficher toutes les heures avec une étiquette et un comte, et ainsi de suite ...

TimeSeries timeSeries = new TimeSeries(title, "Blah", "blah", clazz); 
// clazz is one of Day.class, Month.class, Hour.class 
for (final ReportRecord reportRecord : records) { 
int count = reportRecord.getCount(); 
Date start = reportRecord.getDateRange().getStart(); 
RegularTimePeriod period = null; 
switch (type) { 
    case DAY: period = new Day(start); break; 
    case MONTH: period = new Month(start); break; 
    case HOUR: period = new Hour(start); break; 
} 
timeSeries.add(new TimeSeriesDataItem(period, count)); 
} 
return new TimeSeriesCollection(timeSeries); 

Merci, Josh

Répondre

0

Il me semble jfreechart fait comme vous l'avez demandé. Par exemple, quand vous dites:

"Si je choisis des heures, il montre des données par jour avec beaucoup de barres entre chaque jour (c.-à-d., 24 petites barres dans la journée)."

Le code que vous avez fourni ajoute un article à la collection pour chaque heure, par conséquent une petite barre séparée pour chaque heure est appropriée. Si vous modifiez la logique d'ajout de collection pour ajouter uniquement une valeur au moment où vous décidez (par exemple une fois par jour à minuit), elle ne doit produire qu'une seule barre dans le graphique pour le jour en question. Dans le passé, j'ai simplement placé les valeurs à la seconde près (pas que vous ayez besoin de cette précision), et jfreechart s'occupera du reste, en fonction de l'échelle de temps que vous choisissez (par programmation ou interactivement).

comme dans:

 TimeSeriesCollection dataset = new TimeSeriesCollection(); 
     TimeSeries series = new TimeSeries("Basal", Second.class); 
     for (BasalRate basal : pInsulin.basals) { 
      Second lSecond = new Second(basal.getTime()); 
      series.addOrUpdate(lSecond, basal.getValue()); 
     } 
     dataset.addSeries(series); 
Questions connexes