سؤال

أنا جديد في استخدام JFreechart وأنا متأكد من أن هناك حلًا بسيطًا لمشكلتي. .

مشكلة:
لديّ مخطط يعرض "أنواع أحداث" متعددة على طول محور التاريخ X. يعرض المحور Y "فئة الأحداث". مشكلتي هي أن آخر تاريخ فقط لنوع الحدث يتم عرضه لكل فئة.

في المثال أدناه ، يعرض الرسم البياني نقاط بيانات لنوع الحدث 1 في 20 يونيو (الفئة 1) وفي 10 يونيو (الفئة 2). لقد أضفت أيضًا نقطة بيانات في 10 يونيو ، من الفئة الأولى ، لكن نقطة 20 يونيو تمحوها.

أعتقد أنني أسيء فهم كيف تعمل CatevoryPlot. هل أستخدم النوع الخاطئ من المخطط؟ اعتقدت أن المخطط المبعثر سيكون التذكرة ولكنه يقبل فقط القيم العددية. أحتاج إلى فئات سلسلة منفصلة على المحور ص.

إذا تمكن أي شخص من توجيهني في الاتجاه الصحيح ، فستجعل يومي حقًا. شكرا للقراءة!

-كريستين

(الرمز أدناه يعمل كما هو بسيط قدر استطاعته)

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 Start. لست متأكدًا من اتباع متطلباتك ، لكن DefaultMultiValueCategoryDataset يوصف بأنه "مجموعة بيانات فئة تحدد قيمًا متعددة لكل عنصر."

إضافة: إذا كنت تريد التمسك به LineAndShapeRenderer, ، على حد سواء LineAndShapeRenderer(false, true) و setBaseLinesVisible() يمكن أن يمنع الرسم خط.

نصائح أخرى

أعتقد أنك تستخدم النوع الخطأ من مجموعة البيانات والمخطط هنا. يبدو أنك تحاول إنشاء مؤامرة مبعثرة ، لذلك يجب أن تستخدم مؤامرة مبعثرة بدلاً من مؤامرة الفئة. في مؤامرة الفئة ، لأن كل زوج من صف/عمود يحصل فقط على قيمة واحدة. لذلك ، في المكالمة الأولى ، تقول إن زوج Event1/Category1 لديه قيمة من 10 يونيو. قد ترغب أيضًا في إلقاء نظرة على مؤامرات السلاسل الزمنية أيضًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top