我是使用JFreeChart的新手,我确信我的问题有一个简单的解决方案。
问题:
我有一个图表,显示沿日期X轴的多个“事件类型”。 Y轴显示“事件类别”。我的问题是每个类别只显示事件类型的最新日期。
在下面的示例中该图表显示了6月20日(类别1)和6月10日(类别2)的事件类型1的数据点。我还在6月10日的第1类中添加了一个数据点,但是6月20日的数据点已经删除了它。
我认为我误解了CategoryPlot是如何工作的。我使用错误的图表类型吗?我认为散点图是票,但它只接受数值。我需要在Y轴上有离散的字符串类别。
如果有人能指出我正确的方向,那么你真的会成为我的一天。谢谢你的阅读!
-Christine
(下面的代码按原样运行。它就像我能做到的那样简单)
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);
}
}
答案 0 :(得分:1)
我认为您在这里使用了错误类型的数据集和图表。您似乎正在尝试创建散点图,因此您应该使用散点图而不是类别图。在类别图中,因为每个行/列对只获得一个值。因此,在第一次调用中,您说event1 / category1对的值为june10.getMiddleMillisecond,然后您将其值更改为june20.getMiddleMillisecond。您可能还想查看时间序列图。
答案 1 :(得分:1)
除了@Jeff Storey的建议之外,您可能会从JFreeChart Samples获得一些灵感,并且不要忽视通过Java Web Start提供的Demo应用程序。我不确定我是否遵循您的要求,但DefaultMultiValueCategoryDataset
被描述为“为每个项目定义多个值的类别数据集。”
附录:如果您想坚持使用LineAndShapeRenderer
,LineAndShapeRenderer(false, true)
和setBaseLinesVisible()
都可以排除线条图。