1

私は JFreeChart を初めて使用しますが、私の問題に対する簡単な解決策があると確信しています。.

問題:
日付の X 軸に沿って複数の「イベント タイプ」を示すチャートがあります。Y 軸は「イベント カテゴリ」を示します。私の問題は、イベント タイプの最新の日付のみが各カテゴリに表示されることです。

以下の例では、グラフは 6 月 20 日 (カテゴリ 1) と 6 月 10 日 (カテゴリ 2) のイベント タイプ 1 のデータ ポイントを示しています。6 月 10 日のカテゴリ 1 のデータ ポイントも追加しましたが、6 月 20 日のポイントで消去されます。

CategoryPlot の仕組みを誤解していると思います。間違った種類のグラフを使用していませんか? 散布図がチケットになると思いましたが、数値しか受け入れません。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);   
    }   
}  
4

2 に答える 2

1

ここで間違ったタイプのデータセットとグラフを使用していると思います。散布図を作成しようとしているように見えるので、カテゴリ プロットの代わりに散布図を使用する必要があります。カテゴリ プロットでは、各行/列のペアが 1 つの値しか取得しないためです。したがって、最初の呼び出しでは、event1/category1 のペアの値が june10.getMiddleMillisecond であると言ってから、その値を june20.getMiddleMillisecond に変更しています。また、時系列プロットも見たいと思うかもしれません。

于 2010-04-20T19:21:52.090 に答える
1

@Jeff Storey の提案に加えて、 JFreeChart Samplesからインスピレーションを得られるかもしれません。Java Web Start から入手できるDemoアプリケーションを見逃さないでください。あなたの要件に従っているかどうかわかりませんが、DefaultMultiValueCategoryDataset「各アイテムに複数の値を定義するカテゴリ データセット」と説明されています。

補遺: にこだわりたい場合はLineAndShapeRenderer、 と 両方ともLineAndShapeRenderer(false, true)線画setBaseLinesVisible()を除外できます。

于 2010-04-21T02:14:08.723 に答える