【问题标题】:JFreeChart: set line colors for XY Chart - 4 series, 2 datasets, dual axesJFreeChart:为 XY 图表设置线条颜色 - 4 系列、2 个数据集、双轴
【发布时间】:2014-01-29 10:07:11
【问题描述】:

我似乎无法为所有四行设置单独的行颜色。当我使用这些线条时:

plot.getRenderer().setSeriesPaint(0, new Color(0x00, 0xFF, 0x00));
plot.getRenderer().setSeriesPaint(1, new Color(0x00, 0x00, 0x00));

(在下面的代码中),它将第一行应用于 BOTH 数据集中的 FIRST 系列,将第二行应用于 BOTH 数据集中的 SECOND 系列。

如何为所有 4 行设置不同的颜色?

谢谢!

private JFreeChart createXYLineChart(String title) {
    XYDataset dataset1 = createXYVoltageDataset();
    XYDataset dataset2 = createXYCurrentDataset();

    JFreeChart chart = ChartFactory.createXYLineChart("Profile", "Set Current", "Voltage", null);
    XYPlot plot = (XYPlot) chart.getPlot(); 
    plot.setDataset(0, dataset1);
    plot.setDataset(1, dataset2);

    plot.setRangeAxis(1, new NumberAxis("Actual Current")); 
    plot.mapDatasetToRangeAxis(1, 1); //2nd dataset to 2nd y-axi

    plot.setBackgroundPaint(new Color(0xFF, 0xFF, 0xFF));
    plot.setDomainGridlinePaint(new Color(0x00, 0x00, 0xff));
    plot.setRangeGridlinePaint(new Color(0xff, 0x00, 0x00));

    plot.getRenderer().setSeriesPaint(0, new Color(0x00, 0xFF, 0x00));
    plot.getRenderer().setSeriesPaint(1, new Color(0x00, 0x00, 0x00));
    //plot.getRenderer().setSeriesPaint(2, new Color(0xFF, 0x00, 0x00)); // Does nothing
    //plot.getRenderer().setSeriesPaint(3, new Color(0x00, 0x00, 0xFF)); // Does nothing
    //plot.getRenderer(1).setSeriesPaint(3, new Color(0x00, 0x00, 0xFF)); // Null pointer exceptiopn

    return chart;
}

private  XYDataset createXYVoltageDataset() {
    final XYSeries s1 = new XYSeries("Min Voltage");
    final XYSeries s2 = new XYSeries("Max Voltage");
    for (int i = 0; i < profile.getNumSteps(); i++) s1.add(i, profile.getStepMinVoltage(i));
    for (int i = 0; i < profile.getNumSteps(); i++) s2.add(i, profile.getStepMaxVoltage(i));
    XYSeriesCollection dataset = new XYSeriesCollection();
    dataset.addSeries(s1);
    dataset.addSeries(s2);
    return dataset;
}
private  XYDataset createXYCurrentDataset() {
    final XYSeries s1 = new XYSeries("Min Current");
    final XYSeries s2 = new XYSeries("Max Current");
    for (int i = 0; i < profile.getNumSteps(); i++){
        s1.add(i, profile.getStepMinCurrent(i));
    }
    for (int i = 0; i < profile.getNumSteps(); i++) s2.add(i, profile.getStepMaxCurrent(i));
    XYSeriesCollection dataset = new XYSeriesCollection();
    dataset.addSeries(s1);
    dataset.addSeries(s2);
    return dataset;
}

【问题讨论】:

    标签: java jfreechart


    【解决方案1】:

    这是我的最终解决方案:

    XYDataset dataset1 = createXYVoltageDataset();
    XYDataset dataset2 = createXYCurrentDataset();
    
    XYLineAndShapeRenderer r1 = new XYLineAndShapeRenderer();
    r1.setSeriesPaint(0, new Color(0xff, 0xff, 0x00)); 
    r1.setSeriesPaint(1, new Color(0x00, 0xff, 0xff)); 
    r1.setSeriesShapesVisible(0,  false);
    r1.setSeriesShapesVisible(1,  false);
    
    XYLineAndShapeRenderer r2 = new XYLineAndShapeRenderer();
    r2.setSeriesPaint(0, new Color(0xff, 0x00, 0x00)); 
    r2.setSeriesPaint(1, new Color(0x00, 0xff, 0x00)); 
    r2.setSeriesShapesVisible(0,  false);
    r2.setSeriesShapesVisible(1,  false);
    
    JFreeChart chart = ChartFactory.createXYLineChart("Profile", "Set Current", "Voltage", null);
    XYPlot plot = (XYPlot) chart.getPlot(); 
    
    plot.setDataset(0, dataset1);
    plot.setRenderer(0, r1);
    
    plot.setDataset(1, dataset2);
    plot.setRenderer(1, r2);
    
    plot.setRangeAxis(1, new NumberAxis("Actual Current")); 
    plot.mapDatasetToRangeAxis(1, 1); //2nd dataset to 2nd y-axi
    
    plot.setBackgroundPaint(new Color(0xFF, 0xFF, 0xFF));
    plot.setDomainGridlinePaint(new Color(0x00, 0x00, 0xff));
    plot.setRangeGridlinePaint(new Color(0xff, 0x00, 0x00));
    
    return chart;
    

    【讨论】:

      【解决方案2】:

      我会创建自己的情节和两个渲染器,使用 new 而不是 chart.getPlot()plot.getRenderer()。我将尝试举一个类似于您的代码的示例,以便您明白我的意思;你必须调整它以满足你的需要:

       private JFreeChart createChart(String title) {
          XYDataset dataset1 = createDataset1();
          XYDataset dataset2 = createDataset2();
      
          XYBarRenderer renderer1 = new XYBarRenderer(0.20000000000000001D);
          renderer1.setSeriesPaint(0, Color.BLUE);
          renderer1.setSeriesPaint(1, Color.red);
          DateAxis domainAxis = new DateAxis("Date");
          NumberAxis valueAxis = new NumberAxis("Value");
          XYPlot plot = new XYPlot(dataset1, domainAxis, valueAxis, renderer1);
      
          StandardXYItemRenderer renderer2 = new StandardXYItemRenderer();
          renderer2.setSeriesPaint(0, Color.CYAN);
          renderer2.setSeriesPaint(1, Color.YELLOW);
      
          plot.setDataset(1, dataset2);
          plot.setRenderer(1, renderer2);
      
          JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, true);
      
          return chart;
      }
      

      编辑:顺便说一下,如果您经常使用 JFreeChart,我建议您购买该指南。除了非常有用的 PDF 之外,您还可以在演示中心获得所有示例的源代码,这是非常宝贵的。

      【讨论】:

        猜你喜欢
        • 2012-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-17
        相关资源
        最近更新 更多