⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 boxandwhiskerrenderer.java

📁 这是一个segy数据显示程序
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* =========================================================== * JFreeChart : a free chart library for the Java(tm) platform * =========================================================== * * (C) Copyright 2000-2004, by Object Refinery Limited and Contributors. * * Project Info:  http://www.jfree.org/jfreechart/index.html * * This library is free software; you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Foundation; * either version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License along with this * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc.  * in the United States and other countries.] * * -------------------------- * BoxAndWhiskerRenderer.java * -------------------------- * (C) Copyright 2003, 2004, by David Browning and Contributors. * * Original Author:  David Browning (for the Australian Institute of Marine Science); * Contributor(s):   David Gilbert (for Object Refinery Limited); *                   Tim Bardzil; * * $Id: BoxAndWhiskerRenderer.java,v 1.29 2004/06/02 14:40:50 mungady Exp $ * * Changes * ------- * 21-Aug-2003 : Version 1, contributed by David Browning (for the Australian Institute of  *               Marine Science); * 01-Sep-2003 : Incorporated outlier and farout symbols for low values also (DG); * 08-Sep-2003 : Changed ValueAxis API (DG); * 16-Sep-2003 : Changed ChartRenderingInfo --> PlotRenderingInfo (DG); * 07-Oct-2003 : Added renderer state (DG); * 12-Nov-2003 : Fixed casting bug reported by Tim Bardzil (DG); * 13-Nov-2003 : Added drawHorizontalItem(...) method contributed by Tim Bardzil (DG); * 25-Apr-2004 : Added fillBox attribute, equals() method and added serialization code (DG); * 29-Apr-2004 : Changed drawing of upper and lower shadows - see bug report 944011 (DG); *  */package org.jfree.chart.renderer;import java.awt.Color;import java.awt.Graphics2D;import java.awt.Paint;import java.awt.Shape;import java.awt.Stroke;import java.awt.geom.Ellipse2D;import java.awt.geom.Line2D;import java.awt.geom.Point2D;import java.awt.geom.Rectangle2D;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;import java.util.ArrayList;import java.util.Collections;import java.util.Iterator;import java.util.List;import org.jfree.chart.axis.CategoryAxis;import org.jfree.chart.axis.ValueAxis;import org.jfree.chart.entity.CategoryItemEntity;import org.jfree.chart.entity.EntityCollection;import org.jfree.chart.event.RendererChangeEvent;import org.jfree.chart.labels.CategoryToolTipGenerator;import org.jfree.chart.plot.CategoryPlot;import org.jfree.chart.plot.PlotOrientation;import org.jfree.chart.plot.PlotRenderingInfo;import org.jfree.data.CategoryDataset;import org.jfree.data.statistics.BoxAndWhiskerCategoryDataset;import org.jfree.io.SerialUtilities;import org.jfree.ui.RectangleEdge;import org.jfree.util.ObjectUtils;import org.jfree.util.PublicCloneable;/** * A box-and-whisker renderer. */public class BoxAndWhiskerRenderer extends AbstractCategoryItemRenderer                                    implements Cloneable, PublicCloneable, Serializable {    /** The color used to paint the median line and average marker. */    private transient Paint artifactPaint;    /** A flag that controls whether or not the box is filled. */    private boolean fillBox;        /** The margin between items (boxes) within a category. */    private double itemMargin;    /**     * Default constructor.     */    public BoxAndWhiskerRenderer() {        this.artifactPaint = Color.black;        this.fillBox = true;        this.itemMargin = 0.20;    }    /**     * Returns the paint used to color the median and average markers.     *      * @return A paint.     */    public Paint getArtifactPaint() {        return this.artifactPaint;    }    /**     * Sets the paint used to color the median and average markers.     *      * @param paint  the paint.     */    public void setArtifactPaint(Paint paint) {        this.artifactPaint = paint;    }    /**     * Returns the flag that controls whether or not the box is filled.     *      * @return A boolean.     */    public boolean getFillBox() {        return this.fillBox;       }        /**     * Sets the flag that controls whether or not the box is filled and sends a      * {@link RendererChangeEvent} to all registered listeners.     *      * @param flag  the flag.     */    public void setFillBox(boolean flag) {        this.fillBox = flag;        notifyListeners(new RendererChangeEvent(this));    }    /**     * Returns the item margin.  This is a percentage of the available space that is allocated     * to the space between items in the chart.     *      * @return The margin.     */    public double getItemMargin() {        return this.itemMargin;    }    /**     * Sets the item margin.     *      * @param margin  the margin.     */    public void setItemMargin(double margin) {        this.itemMargin = margin;    }    /**     * Initialises the renderer.     * <p>     * This method gets called once at the start of the process of drawing a chart.     *     * @param g2  the graphics device.     * @param dataArea  the area in which the data is to be plotted.     * @param plot  the plot.     * @param rendererIndex  the renderer index.     * @param info  collects chart rendering information for return to caller.     *     * @return The renderer state.     */    public CategoryItemRendererState initialise(Graphics2D g2,                                                Rectangle2D dataArea,                                                CategoryPlot plot,                                                int rendererIndex,                                                PlotRenderingInfo info) {        CategoryItemRendererState state = super.initialise(g2, dataArea, plot, rendererIndex, info);        // calculate the box width        CategoryAxis domainAxis = getDomainAxis(plot, rendererIndex);        CategoryDataset dataset = plot.getDataset(rendererIndex);        if (dataset != null) {            int columns = dataset.getColumnCount();            int rows = dataset.getRowCount();            double space = 0.0;            PlotOrientation orientation = plot.getOrientation();            if (orientation == PlotOrientation.HORIZONTAL) {                space = dataArea.getHeight();            }            else if (orientation == PlotOrientation.VERTICAL) {                space = dataArea.getWidth();            }            double categoryMargin = 0.0;            double currentItemMargin = 0.0;            if (columns > 1) {                categoryMargin = domainAxis.getCategoryMargin();            }            if (rows > 1) {                currentItemMargin = getItemMargin();            }            double used = space * (1 - domainAxis.getLowerMargin() - domainAxis.getUpperMargin()                                     - categoryMargin - currentItemMargin);            if ((rows * columns) > 0) {                state.setBarWidth(used / (dataset.getColumnCount() * dataset.getRowCount()));            }            else {                state.setBarWidth(used);            }        }                return state;    }    /**     * Draw a single data item.     *     * @param g2  the graphics device.     * @param state  the renderer state.     * @param dataArea  the area in which the data is drawn.     * @param plot  the plot.     * @param domainAxis  the domain axis.     * @param rangeAxis  the range axis.     * @param dataset  the data.     * @param row  the row index (zero-based).     * @param column  the column index (zero-based).     */    public void drawItem(Graphics2D g2,                         CategoryItemRendererState state,                         Rectangle2D dataArea,                         CategoryPlot plot,                         CategoryAxis domainAxis,                         ValueAxis rangeAxis,                         CategoryDataset dataset,                         int row,                         int column) {                                     if (!(dataset instanceof BoxAndWhiskerCategoryDataset)) {            throw new IllegalArgumentException("BoxAndWhiskerRenderer.drawItem()"                + " : the data should be of type BoxAndWhiskerCategoryDataset only.");        }        PlotOrientation orientation = plot.getOrientation();        if (orientation == PlotOrientation.HORIZONTAL) {            drawHorizontalItem(                g2, state, dataArea, plot, domainAxis, rangeAxis, dataset, row, column            );        }         else if (orientation == PlotOrientation.VERTICAL) {            drawVerticalItem(                g2, state, dataArea, plot, domainAxis, rangeAxis, dataset, row, column            );        }            }    /**     * Draws the visual representation of a single data item when the plot has a horizontal     * orientation.     *     * @param g2  the graphics device.     * @param state  the renderer state.     * @param dataArea  the area within which the plot is being drawn.     * @param plot  the plot (can be used to obtain standard color information etc).     * @param domainAxis  the domain axis.     * @param rangeAxis  the range axis.     * @param dataset  the dataset.     * @param row  the row index (zero-based).     * @param column  the column index (zero-based).     */    public void drawHorizontalItem(Graphics2D g2,                                   CategoryItemRendererState state,                                   Rectangle2D dataArea,                                   CategoryPlot plot,                                   CategoryAxis domainAxis,                                   ValueAxis rangeAxis,                                   CategoryDataset dataset,                                   int row,                                   int column) {        BoxAndWhiskerCategoryDataset bawDataset = (BoxAndWhiskerCategoryDataset) dataset;        double categoryEnd = domainAxis.getCategoryEnd(            column, getColumnCount(), dataArea, plot.getDomainAxisEdge());        double categoryStart = domainAxis.getCategoryStart(            column, getColumnCount(), dataArea, plot.getDomainAxisEdge());        double categoryWidth = Math.abs(categoryEnd - categoryStart);        double yy = categoryStart;        int seriesCount = getRowCount();        int categoryCount = getColumnCount();        if (seriesCount > 1) {            double seriesGap = dataArea.getWidth() * getItemMargin()                               / (categoryCount * (seriesCount - 1));            double usedWidth = (state.getBarWidth() * seriesCount)                                + (seriesGap * (seriesCount - 1));            // offset the start of the boxes if the total width used is smaller            // than the category width            double offset = (categoryWidth - usedWidth) / 2;            yy = yy + offset + (row * (state.getBarWidth() + seriesGap));        }         else {            // offset the start of the box if the box width is smaller than the category width            double offset = (categoryWidth - state.getBarWidth()) / 2;            yy = yy + offset;        }        Paint p = this.getItemPaint(row, column);        if (p != null) {            g2.setPaint(p);        }        Stroke s = getItemStroke(row, column);        g2.setStroke(s);        RectangleEdge location = plot.getRangeAxisEdge();        Number xQ1 = bawDataset.getQ1Value(row, column);        Number xQ3 = bawDataset.getQ3Value(row, column);        Number xMax = bawDataset.getMaxRegularValue(row, column);        Number xMin = bawDataset.getMinRegularValue(row, column);        Shape box = null;        if (xQ1 != null && xQ3 != null && xMax != null && xMin != null) {            double xxQ1 = rangeAxis.valueToJava2D(xQ1.doubleValue(), dataArea, location);            double xxQ3 = rangeAxis.valueToJava2D(xQ3.doubleValue(), dataArea, location);            double xxMax = rangeAxis.valueToJava2D(xMax.doubleValue(), dataArea, location);            double xxMin = rangeAxis.valueToJava2D(xMin.doubleValue(), dataArea, location);            double yymid = yy + state.getBarWidth() / 2.0;                        // draw the upper shadow...            g2.draw(new Line2D.Double(xxMax, yymid, xxQ3, yymid));            g2.draw(new Line2D.Double(xxMax, yy, xxMax, yy + state.getBarWidth()));            // draw the lower shadow...            g2.draw(new Line2D.Double(xxMin, yymid, xxQ1, yymid));            g2.draw(new Line2D.Double(xxMin, yy, xxMin, yy + state.getBarWidth()));            // draw the box...            box = new Rectangle2D.Double(                Math.min(xxQ1, xxQ3), yy, Math.abs(xxQ1 - xxQ3), state.getBarWidth()            );            if (this.fillBox) {                g2.fill(box);            }             g2.draw(box);        }        g2.setPaint(this.artifactPaint);        double aRadius = 0;                 // average radius        // draw mean - SPECIAL AIMS REQUIREMENT...        Number xMean = bawDataset.getMeanValue(row, column);        if (xMean != null) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -