java boxplot_java – 具有多个类别的Boxplots的JFreeChart缩放

我目前正在使用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 values = createSampleData();

ArrayList categories = createSampleCategories();

for (int i=0;i<=5;i++){

for (String category : categories){

dataset.add(values,i,category);

}

}

return dataset;

}

private ArrayList createSampleCategories() {

ArrayList tmp = new ArrayList();

for (int i=0;i<=20;i++){

tmp.add("Category"+i);

}

return tmp;

}

private ArrayList createSampleData() {

ArrayList tmp = new ArrayList();

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的首选大小,而不是图表,如图here和here所示.

附录:我不认为您可以有用地将图表添加到滚动窗格.相反,创建一个类似于SlidingCategoryDataset的类来实现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 columns;

private List>> data;

private DefaultBoxAndWhiskerCategoryDataset dataset;

private CategoryPlot plot;

private ChartPanel chartPanel;

private JPanel controlPanel;

private int start = 0;

public BoxAndWhiskerDemo() {

createData();

createDataset(start);

createChartPanel();

createControlPanel();

}

private void createData() {

columns = new ArrayList(COLS);

data = new ArrayList>>();

for (int i = 0; i < COLS; i++) {

String name = "Category" + String.valueOf(i + 1);

columns.add(name);

List> list = new ArrayList>();

for (int j = 0; j < ROWS; j++) {

list.add(createValues());

}

data.add(list);

}

}

private List createValues() {

List list = new ArrayList();

for (int i = 0; i < VALUES; i++) {

list.add(rnd.nextGaussian());

}

return list;

}

private void createDataset(int start) {

dataset = new DefaultBoxAndWhiskerCategoryDataset();

for (int i = start; i < start + VISIBLE; i++) {

List> list = data.get(i);

int row = 0;

for (List values : list) {

String category = columns.get(i);

dataset.add(values, "s" + row++, category);

}

}

}

private void createChartPanel() {

CategoryAxis xAxis = new CategoryAxis("Category");

NumberAxis yAxis = new NumberAxis("Value");

BoxAndWhiskerRenderer renderer = new BoxAndWhiskerRenderer();

plot = new CategoryPlot(dataset, xAxis, yAxis, renderer);

JFreeChart chart = new JFreeChart("BoxAndWhiskerDemo", plot);

chartPanel = new ChartPanel(chart);

}

private void createControlPanel() {

controlPanel = new JPanel();

controlPanel.add(new JButton(new AbstractAction("\u22b2Prev") {

@Override

public void actionPerformed(ActionEvent e) {

start -= VISIBLE;

if (start < 0) {

start = 0;

return;

}

createDataset(start);

plot.setDataset(dataset);

}

}));

controlPanel.add(new JButton(new AbstractAction("Next\u22b3") {

@Override

public void actionPerformed(ActionEvent e) {

start += VISIBLE;

if (start > COLS - VISIBLE) {

start = COLS - VISIBLE;

return;

}

createDataset(start);

plot.setDataset(dataset);

}

}));

}

public ChartPanel getChartPanel() {

return chartPanel;

}

public JPanel getControlPanel() {

return controlPanel;

}

public static void main(String[] args) throws IOException {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

JFrame frame = new JFrame();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

BoxAndWhiskerDemo demo = new BoxAndWhiskerDemo();

frame.add(demo.getChartPanel(), BorderLayout.CENTER);

frame.add(demo.getControlPanel(), BorderLayout.SOUTH);

frame.pack();

frame.setLocationRelativeTo(null);

frame.setVisible(true);

}

});

}

}

标签:java,charts,scaling,boxplot,jfreechart

来源: https://codeday.me/bug/20190626/1294947.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值