jfreechart categoryplotカテゴリを上書きします
-
30-09-2019 - |
質問
私はJfreechartを使用するのが初めてであり、私の問題には簡単な解決策があると確信しています。 。
問題:
日付x軸に沿って複数の「イベントタイプ」を示すチャートがあります。 y軸は「イベントカテゴリ」を示しています。私の問題は、各カテゴリのイベントタイプの最新の日付のみが表示されることです。
下の例では、チャートには、6月20日(カテゴリ1)および6月10日(カテゴリ2)のイベントタイプ1のデータポイントが示されています。また、6月10日、カテゴリ1のデータポイントを追加しましたが、6月20日ポイントは消去されます。
カテゴリプロットがどのように機能しているかを誤解していると思います。間違ったタイプのチャートを使用していますか?散布図はチケットになると思いましたが、数値のみを受け入れます。 Y軸に個別の文字列カテゴリが必要です。
誰かが私を正しい方向に向けることができれば、あなたは本当に私の一日を作るでしょう。読んでくれてありがとう!
- クリスチン
(以下のコードはそのまま動作します。それは私ができる限り簡単です)
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);
}
}
解決
@Jeff Storeyの提案に加えて、あなたは jfreechartサンプル, 、そして見落とさないでください デモ Application、Java Web Startを介して利用可能。私はあなたの要件に従うかどうかわかりませんが、 DefaultMultiValueCategoryDataset
「各アイテムの複数の値を定義するカテゴリデータセット」と呼ばれています。
補遺:固執したい場合 LineAndShapeRenderer
, 、 両方とも LineAndShapeRenderer(false, true)
と setBaseLinesVisible()
線の図面を排除できます。
他のヒント
ここで間違ったタイプのデータセットとチャートを使用していると思います。散布図を作成しようとしているように見えるので、カテゴリプロットの代わりに散布図を使用する必要があります。カテゴリプロットでは、各行/列ペアが単一の値のみを取得するためです。したがって、最初の呼び出しでは、Event1/category1ペアの値は6月10日にあると言っています。また、時系列のプロットも見たいかもしれません。