当前位置: 首页 > 面试题库 >

具有多个类别的Boxplots的JFreeChart缩放

郑琦
2023-03-14
问题内容

我目前正在使用JFreeChart显示框线图的基于Java的项目。

我的问题是如何显示包含带有大约20个类别和5个以上系列的CategoryDataset的箱形图的图表。

当前,如果未设置ChartPanel的首选大小,则图例,标签和注释可读取,但Boxplots太小。或设置ChartPanel的大小,以使Boxplots具有可接受的大小,然后将图例,标签和注释水平拉伸。

我的问题是,如何在不缩放图例,轴标签和图表注释的情况下正确缩放框线图?是否可以在不缩放图表所有元素的情况下缩放图表?

代码示例

import java.awt.Color;
import java.awt.Dimension;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;

import javax.swing.JFrame;
import javax.swing.JScrollPane;

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.renderer.category.BoxAndWhiskerRenderer;
import org.jfree.data.statistics.DefaultBoxAndWhiskerCategoryDataset;


public class StretchedBoxAndWhiskerExample{

DefaultBoxAndWhiskerCategoryDataset dataset;
JFreeChart chart;
ChartPanel chartPanel;
JFrame frame;
JScrollPane scrollPane;

public StretchedBoxAndWhiskerExample() {
    createCategoryBoxplot();

    frame = new JFrame();
    scrollPane = new JScrollPane(chartPanel);
    scrollPane.setPreferredSize(new Dimension(800,700));
    scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    frame.add(scrollPane);
    frame.pack();
    frame.setVisible(true);
}

private void createCategoryBoxplot(){   
    dataset = createCategoryDataset();
    CategoryAxis xAxis = new CategoryAxis("");
    NumberAxis yAxis = new NumberAxis("Score");

    BoxAndWhiskerRenderer renderer = new BoxAndWhiskerRenderer();
    CategoryPlot plot = new CategoryPlot(dataset, xAxis, yAxis, renderer);
    createJFreeChart(plot,"Test");

    // Design
    renderer.setFillBox(false);
    renderer.setMeanVisible(false);

    chart.setBackgroundPaint(Color.white); 
    plot.setBackgroundPaint(Color.lightGray); 
    plot.setDomainGridlinePaint(Color.white); 
    plot.setDomainGridlinesVisible(true); 
    plot.setRangeGridlinePaint(Color.white);
    plot.getRangeAxis().setRange(-10.5, 10.5);


    chartPanel = new ChartPanel(chart);
    chartPanel.setPreferredSize(new Dimension(3250,600));
}

private DefaultBoxAndWhiskerCategoryDataset createCategoryDataset() {

    dataset = new DefaultBoxAndWhiskerCategoryDataset();
    ArrayList<Double> values = createSampleData();
    ArrayList<String> categories = createSampleCategories();
    for (int i=0;i<=5;i++){
        for (String category : categories){
            dataset.add(values,i,category);
        }
    }
    return dataset;
}


private ArrayList<String> createSampleCategories() {
    ArrayList<String> tmp = new ArrayList<String>();
    for (int i=0;i<=20;i++){
        tmp.add("Category"+i);
    }
    return tmp;
}

private ArrayList<Double> createSampleData() {
    ArrayList<Double> tmp = new ArrayList<Double>();
    for (int i=0;i<10;i++){
        tmp.add(5.0);
        tmp.add(7.0);
        tmp.add(2.0);
        tmp.add(4.0);
    }
    return tmp;
}

private void createJFreeChart(CategoryPlot plot, String title){
    chart = new JFreeChart(title, plot);
}

public static void main(String[] args) throws IOException { 
    StretchedBoxAndWhiskerExample demo = new StretchedBoxAndWhiskerExample();

}
}

问题答案:

设置包含容器ChartPanel(而不是图表)的首选大小,如此处和此处所示。

附录:我认为你无法将图表添加到滚动窗格中。而是创建一个与SlidingCategoryDatasetImplements类似的类BoxAndWhiskerCategoryDataset。将滚动条添加到控制第一个显示的索引的框架。

附录:一种不太雄心勃勃的方法是使用一些适当的控件来分页数据集的一部分,如下例所示。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
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.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.renderer.category.BoxAndWhiskerRenderer;
import org.jfree.data.statistics.DefaultBoxAndWhiskerCategoryDataset;

/** @see https://stackoverflow.com/questions/6844759 */
public class BoxAndWhiskerDemo {

    private static final int COLS = 20;
    private static final int VISIBLE = 4;
    private static final int ROWS = 5;
    private static final int VALUES = 10;
    private static final Random rnd = new Random();
    private List<String> columns;
    private List<List<List<Double>>> data;
    private DefaultBoxAndWhiskerCategoryDataset dataset;
    private CategoryPlot plot;
    private ChartPanel chartPanel;
    private JPanel controlPanel;
    private int start = 0;

    public BoxAndWhiskerDemo() {


 类似资料:
  • 问题内容: 如何使用https://www.amcharts.com/demos/line-chart-with-scroll-and- zoom/ 这样的图表 我对这些功能特别感兴趣 为了能够使用这两个选择控件选择域轴窗口。 为了能够通过选择部分域轴进行缩放。 为了能够缩小并查看大图。 为了能够映射到范围轴(Y)并在任意点(无标记)像工具提示一样查看该气球上的值 我在这里尝试了可滚动的JFree

  • 如何拥有像https://www.amcharts.com/demos/line-chart-with-scroll-and-zoom/这样的图表 null 我在这里做了初步尝试,可滚动JFree域轴和自定义标记标签,在垃圾上帝的帮助下,我使域可滚动。 我仍然缺少这些功能,以便能够有效地使用graph。

  • 问题内容: 您好,我有一个子类,需要覆盖多个鉴别值。 就像是: @DiscriminatorValue(值=“ ACT”,“ DNR”,“ ATT”) 会让我完美。 我们拥有现有的数据,可以将多个鉴别符映射到一个类别(因为它们是我们系统将考虑的同一事物的相似类型) 问题答案: 您可以使用DiscriminatorFormula:

  • 箱线图是衡量数据集中数据分布情况的指标。 它将数据集分为三个四分位数。 该图表示数据集中的最小值,最大值,中值,第一四分位数和第三四分位数。 通过为每个数据集绘制箱线图来比较数据集之间的数据分布也很有用。 通过使用boxplot boxplot()函数在R中创建boxplot() 。 语法 (Syntax) 在R中创建boxplot的基本语法是 - boxplot(x, data, notch,

  • 问题内容: 我想存储有关歌曲文件的信息,这些文件按以下类别分类: 1.流派,例如流行,摇滚,古典等 。2.使用乐器,例如钢琴小提琴等 。3.艺术家 每首歌曲都有许多乐器。每首歌都有很多歌手。 因此,所有关系都是多对多的。我该如何实施?在歌曲实体和这三个类别类型的实体之间建立多对多关系是个好主意吗?还是我应该只有一个继承那些子类别的类别实体? 提前致谢 问题答案: 乐器和艺术家都是“具有”关系的例子

  • 我已经创建了一个类似上面的类,我希望能够使用相同的类使用'colour'作为这个类的替代,如下面。 有没有一种方法可以简单地创造出来?