【问题标题】:Remove x-axis date values in JFreeChart删除 JFreeChart 中的 x 轴日期值
【发布时间】:2015-03-05 22:11:23
【问题描述】:

我是JFreeChart 的新手,不知道如何解决这个问题;我也不知道是否有可能做我假装的事情。问题是这样的,我试图在 Java Swing 应用程序中显示一个图表,我传递了要显示的日期和值。日期是由用户选择的,并且可能不是连续的;我的意思是,如果用户从星期四到星期一选择,则避免星期六和星期日并传递到图表星期四、星期五和星期一。问题是图表从星期四到星期一(包括星期六和星期天)并在 X 轴上显示它们,而它不应该显示它们。基于这个example,我的班级如下:

ArrayList<StringBuffer> dates={20-02-2015,23-02-2015,24-02-2015,25-02-2015,26-02-2015};
args="tittle";
frame=(the frame where I do the call,although it's not needed in myChartPanelDemo2,just added for setting errorDialogs purpose);
ArrayList<StringBuffer> amount = {"serie1","serie2"};
myChartPanelDemo2.init(amount,args,dates,frame);

public class myChartPanelDemo2 {

    static int datasetIndex;
    private static ChartPanel chartPanel;

    public static JPanel init(ArrayList<StringBuffer> amount, String args, 
            ArrayList<StringBuffer> dates, JFrame frame) {
//*****just getting the values***********//
        datasetIndex = 0;
        int cantity = amount.size();
        int cantity2 = fechas.size();
        float[][] resultArray = new float[cantity][cantity];
        float[] result = new float[cantity2];
        for (int x = 0; x < cantity; x++) {
            for (int y = 0; y < cantity2; y++) {
                result[y] = callingDataBase.main(amount.get(x), args, dates.get(y));
            }
            for (int v = 0; v < result.length; v++) {
                resultArray[x][v] = result[v];
            }
//resultArray will be the array from where chartPanel will take the values
        }
        XYDataset roiData = createDataset(args, dates, resultArray, amount);
        JFreeChart chart = ChartFactory.createTimeSeriesChart(args, "Days",
                "Values", roiData, true, true, false);
        XYPlot plot = chart.getXYPlot();
        XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) plot.getRenderer();
        renderer.setBaseShapesVisible(true);
        chartPanel = new ChartPanel(chart);
        JPanel f = new JPanel(new BorderLayout());
        f.add(chartPanel, BorderLayout.CENTER);
        chartPanel.setHorizontalAxisTrace(true);
        chartPanel.setVerticalAxisTrace(true);
        JPanel panel = new JPanel(new BorderLayout());
        panel.add(createTrace(), BorderLayout.SOUTH);
        f.add(panel, BorderLayout.SOUTH);
        f.setVisible(true);
        chartPanel.setSize(new Dimension(frame.getWidth(), frame.getHeight()));
        chartPanel.setMaximumSize(new Dimension(frame.getWidth(), frame.getHeight()));
        chartPanel.setPreferredSize(new Dimension(frame.getWidth(), frame.getHeight()));
        return f;
    }

    /** @see https://stackoverflow.com/a/5522583/230513 */
    private static JComboBox<String> createTrace() {
        final JComboBox<String> trace = new JComboBox<String>();
        final String[] traceCmds = {"Enable Trace", "Disable Trace"};
        trace.setModel(new DefaultComboBoxModel<String>(traceCmds));
        trace.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (traceCmds[0].equals(trace.getSelectedItem())) {
                    chartPanel.setHorizontalAxisTrace(true);
                    chartPanel.setVerticalAxisTrace(true);
                    chartPanel.repaint();
                } else {
                    chartPanel.setHorizontalAxisTrace(false);
                    chartPanel.setVerticalAxisTrace(false);
                    chartPanel.repaint();
                }
            }
        });
        return trace;
    }

    private static XYDataset createDataset(String name,
            ArrayList<StringBuffer> dates, float[][] resultArray,
            ArrayList<StringBuffer> amount) {
        TimeSeriesCollection tsc = new TimeSeriesCollection();
        for (int x = 0; x < GraficoEmpresas.size(); x++) {
            tsc.addSeries(createSeries(GraficoEmpresas.get(x).toString(), fechas,
                    resultArray, x));
        }
        return tsc;


    private static TimeSeries createSeries(String name,
            ArrayList<StringBuffer> dates, float[][] resultArray, int x) {
        final TimeSeries series = new TimeSeries(name);
        int cantity2 = dates.size();
        RegularTimePeriod t = new Day();
        for (int y = 0; y < cantity2; y++) {
            Date fecha;
            SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd-MM-yyyy");
            day = new Date();
            try {
                day = formatoDelTexto.parse(fechas.get(y).toString());
            } catch (ParseException e) {
                e.printStackTrace();
            }
            RegularTimePeriod p = new Day(day);
            series.addOrUpdate(p, resultArray[x][y]);
        }
        return series;
    }
}

我无法上传图片,声誉不够,但结果是 x 轴值的图表:{20-02-2015 -- 21-02-2015 -- 22-02-2015 --23 -02-2015 -- 24-02-2015 -- 25-02-2015 -- 26-02-2015} 除了 21 和 22 之外的每个点都有数据集值,但在轴标签中添加了 21 和 22。

我同时使用 JFreechart 和 JCommon 1.0.16。 我想这是一个自动完成问题,但这只是一个猜测,我无法检查它是否正确。 有谁知道如何避免这种情况或这是不可能的? 谢谢!!

【问题讨论】:

标签: java swing jfreechart


【解决方案1】:

没有完整的示例很难确定,但您可以将SegmentedTimeline 应用于您选择的ChartFactory 创建的DataAxis。使用静态工厂方法newMondayThroughFridayTimeline() 创建周一到周五的SegmentedTimeline,如图here。您可以从图表的图中获得对DataAxis 的引用;或者,跳过ChartFactory 并创建图表de novo,如图所示here

【讨论】:

    【解决方案2】:

    非常感谢!!!只需添加这两行即可解决问题: 来源是:this example ValueAxis domainAxis = plot.getDomainAxis(); ((DateAxis) domainAxis).setTimeline( SegmentedTimeline.newMondayThroughFridayTimeline() );

    整个班级将是:

    public class myChartPanelDemo2 {
    
    static int datasetIndex;
    private static ChartPanel chartPanel;
    
    public static JPanel init(ArrayList<StringBuffer> amount, String args, 
            ArrayList<StringBuffer> dates, JFrame frame) {
    

    //*****只是获取值****************//

         datasetIndex = 0;
        int cantity = amount.size();
        int cantity2 = fechas.size();
        float[][] resultArray = new float[cantity][cantity];
        float[] result = new float[cantity2];
        for (int x = 0; x < cantity; x++) {
            for (int y = 0; y < cantity2; y++) {
                result[y] = callingDataBase.main(amount.get(x), args, dates.get(y));
            }
            for (int v = 0; v < result.length; v++) {
                resultArray[x][v] = result[v];
            }
    

    //resultArray 将是 chartPanel 从中获取值的数组

     }
        XYDataset roiData = createDataset(args, dates, resultArray, amount);
        JFreeChart chart = ChartFactory.createTimeSeriesChart(args, "Days",
                "Values", roiData, true, true, false);
        XYPlot plot = chart.getXYPlot();
        XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) plot.getRenderer();
        renderer.setBaseShapesVisible(true);
    ValueAxis domainAxis = plot.getDomainAxis();
     ((DateAxis) domainAxis).setTimeline( SegmentedTimeline.newMondayThroughFridayTimeline() );
        chartPanel = new ChartPanel(chart);
        JPanel f = new JPanel(new BorderLayout());
        f.add(chartPanel, BorderLayout.CENTER);
        chartPanel.setHorizontalAxisTrace(true);
        chartPanel.setVerticalAxisTrace(true);
        JPanel panel = new JPanel(new BorderLayout());
        panel.add(createTrace(), BorderLayout.SOUTH);
        f.add(panel, BorderLayout.SOUTH);
        f.setVisible(true);
        chartPanel.setSize(new Dimension(frame.getWidth(), frame.getHeight()));
        chartPanel.setMaximumSize(new Dimension(frame.getWidth(), frame.getHeight()));
        chartPanel.setPreferredSize(new Dimension(frame.getWidth(), frame.getHeight()));
        return f;
    }
    
    /** @see https://stackoverflow.com/a/5522583/230513 */
    private static JComboBox<String> createTrace() {
        final JComboBox<String> trace = new JComboBox<String>();
        final String[] traceCmds = {"Enable Trace", "Disable Trace"};
        trace.setModel(new DefaultComboBoxModel<String>(traceCmds));
        trace.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (traceCmds[0].equals(trace.getSelectedItem())) {
                    chartPanel.setHorizontalAxisTrace(true);
                    chartPanel.setVerticalAxisTrace(true);
                    chartPanel.repaint();
                } else {
                    chartPanel.setHorizontalAxisTrace(false);
                    chartPanel.setVerticalAxisTrace(false);
                    chartPanel.repaint();
                }
            }
        });
        return trace;
    }
    
    private static XYDataset createDataset(String name,
            ArrayList<StringBuffer> dates, float[][] resultArray,
            ArrayList<StringBuffer> amount) {
        TimeSeriesCollection tsc = new TimeSeriesCollection();
        for (int x = 0; x < GraficoEmpresas.size(); x++) {
            tsc.addSeries(createSeries(GraficoEmpresas.get(x).toString(), fechas,
                    resultArray, x));
        }
        return tsc;
    
    
    private static TimeSeries createSeries(String name,
            ArrayList<StringBuffer> dates, float[][] resultArray, int x) {
        final TimeSeries series = new TimeSeries(name);
        int cantity2 = dates.size();
        RegularTimePeriod t = new Day();
        for (int y = 0; y < cantity2; y++) {
            Date fecha;
            SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd-MM-yyyy");
            day = new Date();
            try {
                day = formatoDelTexto.parse(fechas.get(y).toString());
            } catch (ParseException e) {
                e.printStackTrace();
            }
            RegularTimePeriod p = new Day(day);
            series.addOrUpdate(p, resultArray[x][y]);
        }
        return series;
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 2020-09-05
      • 2016-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多