在JFreechart中使用多个渲染器 [英] Using Multiple Renderers in JFreechart

查看:113
本文介绍了在JFreechart中使用多个渲染器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有数据,我想表示为一个盒子和胡须图,并设置了一个类别图表来做到这一点。但是,另外,我想添加一个折线图,显示每个数据点的平均值的累积。



现在我的代码是这样的

  DefaultBoxAndWhiskerCategoryDataset dataSet = new DefaultBoxAndWhiskerCategoryDataset(); 
int i = 0;
for(List< Integer> categoryList:categoryLists){
dataSet.add(categoryList,i,BoxAndWhiskers);
i ++;
}
BoxAndWhiskerRenderer renderer = new BoxAndWhiskerRenderer();

double sum = 0;
i = 0;
DefaultCategoryDataset averageDataSet = new DefaultCategoryDataset();
for(双倍平均值:平均值){
sum + = average;
averageDataSet.add(sum,i,Average);
i ++;
}
LineAndShapeRenderer lineAndShapeRenderer = new LineAndShapeRenderer();


CategoryAxis xAxis = new CategoryAxis(Type);
NumberAxis yAxis = new NumberAxis(Value);
CategoryPlot plot = new CategoryPlot(dataSet,xAxis,yAxis,renderer);

plot.setDataset(1,averageDataSet);
plot.setRenderer(1,lineAndShapeRenderer);

JFreeChart chart = new JFreeChart(
Box-and-Whisker,
new Font(SansSerif,Font.BOLD,14),
plot,
true
);

BufferedImage outputImage = chart.createBufferedImage(800,600);

ImageIO.write(outputImage,png,new File(output.png));

然而,当我查看我的output.png时,我只看到框和胡须呈现(不lineandshape graph)。



在输出图像中使用渲染器和数据集时还需要做些什么吗?另外,有没有更好的方法来获得我的盒子和胡须图中的平均值的累积线?

解决方案


我正在试图弄清楚如何在盒子顶部放置点数胡须点正确。


如图所示

  import java.awt.Dimension; 
import java.awt.EventQueue;
import java.util.Arrays;
import javax.swing.JFrame;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.DatasetRenderingOrder;
import org.jfree.chart.renderer.category.BoxAndWhiskerRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.statistics.DefaultBoxAndWhiskerCategoryDataset;

/ **
* @see https://stackoverflow.com/a/38242696/230513
* /
公共类测试{

private void display(){
JFrame f = new JFrame(Test);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DefaultBoxAndWhiskerCategoryDataset boxData = new DefaultBoxAndWhiskerCategoryDataset();
boxData.add(Arrays.asList(30,36,46,55,65,76,81,80,71,59,44,34),Planet,Endor);
boxData.add(Arrays.asList(22,25,34,44,54,63,69,67,59,48,38,28),Planet,Hoth);
BoxAndWhiskerRenderer boxRenderer = new BoxAndWhiskerRenderer();
DefaultCategoryDataset catData = new DefaultCategoryDataset();
catData.addValue(boxData.getMeanValue(0,0),Mean,boxData.getColumnKey(0));
catData.addValue(boxData.getMeanValue(0,1),Mean,boxData.getColumnKey(1));
LineAndShapeRenderer lineRenderer = new LineAndShapeRenderer();
CategoryAxis xAxis = new CategoryAxis(Type);
NumberAxis yAxis = new NumberAxis(Value);
yAxis.setAutoRangeIncludesZero(false);
CategoryPlot plot = new CategoryPlot(boxData,xAxis,yAxis,boxRenderer);
plot.setDataset(1,catData);
plot.setRenderer(1,lineRenderer);
plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
JFreeChart chart = new JFreeChart(Test,JFreeChart.DEFAULT_TITLE_FONT,plot,true);
f.add(新ChartPanel(图表){
@Override
public Dimension getPreferredSize(){
返回新维度(320,480);
}
});
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}

public static void main(String [] args){
EventQueue.invokeLater(new Test():: display);
}
}


I have data that I'd like to represent as a box and whiskers graph, and have set up a category plot to do so. However, in addition, I'd like to add a line chart that shows an accumulation of the averages for each data point.

Right now my code is something like this

DefaultBoxAndWhiskerCategoryDataset dataSet = new DefaultBoxAndWhiskerCategoryDataset();
int i = 0;
for (List<Integer> categoryList : categoryLists) {
    dataSet.add(categoryList, i, "BoxAndWhiskers");
    i++;
}
BoxAndWhiskerRenderer renderer = new BoxAndWhiskerRenderer();

double sum = 0;
i = 0;
DefaultCategoryDataset averageDataSet = new DefaultCategoryDataset();
for (double average : averages) {
    sum += average;
    averageDataSet.add(sum, i, "Average");
    i++;
}
LineAndShapeRenderer lineAndShapeRenderer = new LineAndShapeRenderer();


CategoryAxis xAxis = new CategoryAxis("Type");
NumberAxis yAxis = new NumberAxis("Value");
CategoryPlot plot = new CategoryPlot(dataSet, xAxis, yAxis, renderer);

plot.setDataset(1, averageDataSet);
plot.setRenderer(1, lineAndShapeRenderer);

JFreeChart chart = new JFreeChart(
    "Box-and-Whisker",
    new Font("SansSerif", Font.BOLD, 14),
    plot,
    true
);

BufferedImage outputImage = chart.createBufferedImage(800, 600);

ImageIO.write(outputImage, "png", new File("output.png"));

However, when I look at my output.png, I only see the box and whiskers render (no lineandshape graph).

Is there something else I need to do to use both renderers and datasets in my output image? Additionally, is there a better approach to getting a cumuluative line for the averages in my box and whiskers graph?

解决方案

I'm trying to figure out how to lay the points on top of the box and whiskers points properly.

As shown here for CategoryDataset, each rowKey is a series and each columnKey is an element in the series. In the example below, the "Mean" row of catData includes an entry for each columnKey in boxData. Use setDatasetRenderingOrder() to specify DatasetRenderingOrder.

import java.awt.Dimension;
import java.awt.EventQueue;
import java.util.Arrays;
import javax.swing.JFrame;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.DatasetRenderingOrder;
import org.jfree.chart.renderer.category.BoxAndWhiskerRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.statistics.DefaultBoxAndWhiskerCategoryDataset;

/**
 * @see https://stackoverflow.com/a/38242696/230513
 */
public class Test {

    private void display() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        DefaultBoxAndWhiskerCategoryDataset boxData = new DefaultBoxAndWhiskerCategoryDataset();
        boxData.add(Arrays.asList(30, 36, 46, 55, 65, 76, 81, 80, 71, 59, 44, 34), "Planet", "Endor");
        boxData.add(Arrays.asList(22, 25, 34, 44, 54, 63, 69, 67, 59, 48, 38, 28), "Planet", "Hoth");
        BoxAndWhiskerRenderer boxRenderer = new BoxAndWhiskerRenderer();
        DefaultCategoryDataset catData = new DefaultCategoryDataset();
        catData.addValue(boxData.getMeanValue(0, 0), "Mean", boxData.getColumnKey(0));
        catData.addValue(boxData.getMeanValue(0, 1), "Mean", boxData.getColumnKey(1));
        LineAndShapeRenderer lineRenderer = new LineAndShapeRenderer();
        CategoryAxis xAxis = new CategoryAxis("Type");
        NumberAxis yAxis = new NumberAxis("Value");
        yAxis.setAutoRangeIncludesZero(false);
        CategoryPlot plot = new CategoryPlot(boxData, xAxis, yAxis, boxRenderer);
        plot.setDataset(1, catData);
        plot.setRenderer(1, lineRenderer);
        plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
        JFreeChart chart = new JFreeChart("Test", JFreeChart.DEFAULT_TITLE_FONT, plot, true);
        f.add(new ChartPanel(chart){
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(320, 480);
            }
        });
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Test()::display);
    }
}

这篇关于在JFreechart中使用多个渲染器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆