2010-04-20 90 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