我是使用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样品, ,不要忽略 演示 应用程序,可通过Java Web启动获得。我不确定我遵循您的要求,但是 DefaultMultiValueCategoryDataset 被描述为“为每个项目定义多个值的类别数据集”。

附录:如果您想坚持 LineAndShapeRenderer, , 两个都 LineAndShapeRenderer(false, true)setBaseLinesVisible() 可以阻止线图。

其他提示

我认为您正在使用错误的数据集类型并在此处进行图表。看来您正在尝试创建一个散点图,因此您应该使用散点图而不是类别图。在类别图中,因为每个行/列对仅获得一个值。因此,在第一个通话中,您要说的是Event1/category1对的值为June10.GetMidDlemilliseCond,然后您将其值更改为June20.GetMiddleMilliseCond。您可能还想查看时间序列图。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top