2010-04-20 92 views
1

我是使用JFreeChart的新手,我确信有一个简单的解决方案来解决我的问题。 。JFreeChart CategoryPlot覆盖类别

问题:
我有一个图表,显示了多个“事件类型”沿日期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); 
    } 
} 

回答

1

除了@Jeff Storey的建议之外,您还可以从JFreeChart Samples获得一些灵感,并且不要忽略可通过Java Web Start获得的Demo应用程序。我不确定我是否遵循了您的要求,但DefaultMultiValueCategoryDataset被描述为“为每个项目定义多个值的类别数据集”。

附录:如果你想坚持LineAndShapeRendererLineAndShapeRenderer(false, true)setBaseLinesVisible()都可以排除画线。

+1

谢谢!使用DefaultMultiValueCategoryDataset让我有一半的工作,另一件事是使用ScatterRenderer而不是LineAndShapeRenderer。我现在遇到的问题是自动调整过大狭窄,但我必须进一步研究,再次感谢你们的帮助!:) -Christine – Chris 2010-04-22 12:35:01

+0

优秀!我没有使用'ScatterRenderer',但我在上面的'LineAndShapeRenderer'上评论过。另见http://stackoverflow.com/questions/2081676/looking-for-open-source-tool-for-drawing-charts-in-java/2082297#2082297 – trashgod 2010-04-22 15:32:59

1

我想你使用了错误类型的数据集和图表这里。看起来您正在尝试创建散点图,因此您应该使用散点图而不是类别图。在类别图中,因为每个行/列对只有一个值。因此,在第一次调用中,您说event1/category1对的值为june10.getMiddleMillisecond,则您将其值更改为june20.getMiddleMillisecond。你也可能想看看时间序列图。

+0

谢谢杰夫,我开始感觉到问题所在。我已经看过散点图,但据我所知,我只能使用float [] []作为数据集。我如何使用字符串(类别)而不是浮动来绘制y轴? 如果没有情节可以做我在找什么,也许我需要写我自己的自定义类?如果是这样的话,有没有人有一个好的地方开始了解这方面的建议? 谢谢! -Christine – Chris 2010-04-20 20:28:51

+0

您可以使用CategoryTableXYDataset。我知道它需要x,y值,但是您可以编写自定义轴渲染器(如果需要,还可以编写自定义图例),以使轴上的基础值为数字,但它们呈现为字符串。例如,y轴可能具有值1,2和3,但渲染器会将它们渲染为6月1日,6月2日,6月3日。这不是一个理想的解决方案,但您尝试创建的图表类型并不适合现有的JFreeChart图这可能比编写自己的图更容易 – 2010-04-20 22:20:01