📄 logaxis.java
字号:
/* ===========================================================
* JFreeChart : a free chart library for the Java(tm) platform
* ===========================================================
*
* (C) Copyright 2000-2007, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
* [Java is a trademark or registered trademark of Sun Microsystems, Inc.
* in the United States and other countries.]
*
* ------------
* LogAxis.java
* ------------
* (C) Copyright 2006, 2007, by Object Refinery Limited and Contributors.
*
* Original Author: David Gilbert (for Object Refinery Limited);
* Contributor(s): -;
*
* Changes
* -------
* 24-Aug-2006 : Version 1 (DG);
* 22-Mar-2007 : Use defaultAutoArrange attribute (DG);
* 02-Aug-2007 : Fixed zooming bug, added support for margins (DG);
*
*/
package org.jfree.chart.axis;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.font.FontRenderContext;
import java.awt.font.LineMetrics;
import java.awt.geom.Rectangle2D;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.jfree.chart.event.AxisChangeEvent;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.PlotRenderingInfo;
import org.jfree.chart.plot.ValueAxisPlot;
import org.jfree.data.Range;
import org.jfree.ui.RectangleEdge;
import org.jfree.ui.RectangleInsets;
import org.jfree.ui.TextAnchor;
/**
* A numerical axis that uses a logarithmic scale. The class is an
* alternative to the {@link LogarithmicAxis} class.
*
* @since 1.0.7
*/
public class LogAxis extends ValueAxis {
/** The logarithm base. */
private double base = 10.0;
/** The logarithm of the base value - cached for performance. */
private double baseLog = Math.log(10.0);
/** The smallest value permitted on the axis. */
private double smallestValue = 1E-100;
/** The current tick unit. */
private NumberTickUnit tickUnit;
/** The override number format. */
private NumberFormat numberFormatOverride;
/** The number of minor ticks per major tick unit. */
private int minorTickCount;
/**
* Creates a new <code>LogAxis</code> with no label.
*/
public LogAxis() {
this(null);
}
/**
* Creates a new <code>LogAxis</code> with the given label.
*
* @param label the axis label (<code>null</code> permitted).
*/
public LogAxis(String label) {
super(label, createLogTickUnits(Locale.getDefault()));
setDefaultAutoRange(new Range(0.01, 1.0));
this.tickUnit = new NumberTickUnit(1.0, new DecimalFormat("0.#"));
this.minorTickCount = 10;
}
/**
* Returns the base for the logarithm calculation.
*
* @return The base for the logarithm calculation.
*
* @see #setBase(double)
*/
public double getBase() {
return this.base;
}
/**
* Sets the base for the logarithm calculation and sends an
* {@link AxisChangeEvent} to all registered listeners.
*
* @param base the base value (must be > 1.0).
*
* @see #getBase()
*/
public void setBase(double base) {
if (base <= 1.0) {
throw new IllegalArgumentException("Requires 'base' > 1.0.");
}
this.base = base;
this.baseLog = Math.log(base);
notifyListeners(new AxisChangeEvent(this));
}
/**
* Returns the smallest value represented by the axis.
*
* @return The smallest value represented by the axis.
*
* @see #setSmallestValue(double)
*/
public double getSmallestValue() {
return this.smallestValue;
}
/**
* Sets the smallest value represented by the axis and sends an
* {@link AxisChangeEvent} to all registered listeners.
*
* @param value the value.
*
* @see #getSmallestValue()
*/
public void setSmallestValue(double value) {
if (value <= 0.0) {
throw new IllegalArgumentException("Requires 'value' > 0.0.");
}
this.smallestValue = value;
notifyListeners(new AxisChangeEvent(this));
}
/**
* Returns the current tick unit.
*
* @return The current tick unit.
*
* @see #setTickUnit(NumberTickUnit)
*/
public NumberTickUnit getTickUnit() {
return this.tickUnit;
}
/**
* Sets the tick unit for the axis and sends an {@link AxisChangeEvent} to
* all registered listeners. A side effect of calling this method is that
* the "auto-select" feature for tick units is switched off (you can
* restore it using the {@link ValueAxis#setAutoTickUnitSelection(boolean)}
* method).
*
* @param unit the new tick unit (<code>null</code> not permitted).
*
* @see #getTickUnit()
*/
public void setTickUnit(NumberTickUnit unit) {
// defer argument checking...
setTickUnit(unit, true, true);
}
/**
* Sets the tick unit for the axis and, if requested, sends an
* {@link AxisChangeEvent} to all registered listeners. In addition, an
* option is provided to turn off the "auto-select" feature for tick units
* (you can restore it using the
* {@link ValueAxis#setAutoTickUnitSelection(boolean)} method).
*
* @param unit the new tick unit (<code>null</code> not permitted).
* @param notify notify listeners?
* @param turnOffAutoSelect turn off the auto-tick selection?
*
* @see #getTickUnit()
*/
public void setTickUnit(NumberTickUnit unit, boolean notify,
boolean turnOffAutoSelect) {
if (unit == null) {
throw new IllegalArgumentException("Null 'unit' argument.");
}
this.tickUnit = unit;
if (turnOffAutoSelect) {
setAutoTickUnitSelection(false, false);
}
if (notify) {
notifyListeners(new AxisChangeEvent(this));
}
}
/**
* Returns the number format override. If this is non-null, then it will
* be used to format the numbers on the axis.
*
* @return The number formatter (possibly <code>null</code>).
*
* @see #setNumberFormatOverride(NumberFormat)
*/
public NumberFormat getNumberFormatOverride() {
return this.numberFormatOverride;
}
/**
* Sets the number format override. If this is non-null, then it will be
* used to format the numbers on the axis.
*
* @param formatter the number formatter (<code>null</code> permitted).
*
* @see #getNumberFormatOverride()
*/
public void setNumberFormatOverride(NumberFormat formatter) {
this.numberFormatOverride = formatter;
notifyListeners(new AxisChangeEvent(this));
}
/**
* Returns the number of minor tick marks to display.
*
* @return The number of minor tick marks to display.
*
* @see #setMinorTickCount(int)
*/
public int getMinorTickCount() {
return this.minorTickCount;
}
/**
* Sets the number of minor tick marks to display, and sends an
* {@link AxisChangeEvent} to all registered listeners.
*
* @param count the count.
*
* @see #getMinorTickCount()
*/
public void setMinorTickCount(int count) {
if (count <= 0) {
throw new IllegalArgumentException("Requires 'count' > 0.");
}
this.minorTickCount = count;
notifyListeners(new AxisChangeEvent(this));
}
/**
* Calculates the log of the given value, using the current base.
*
* @param value the value.
*
* @return The log of the given value.
*
* @see #calculateValue(double)
* @see #getBase()
*/
public double calculateLog(double value) {
return Math.log(value) / this.baseLog;
}
/**
* Calculates the value from a given log.
*
* @param log the log value (must be > 0.0).
*
* @return The value with the given log.
*
* @see #calculateLog(double)
* @see #getBase()
*/
public double calculateValue(double log) {
return Math.pow(this.base, log);
}
/**
* Converts a Java2D coordinate to an axis value, assuming that the
* axis covers the specified <code>edge</code> of the <code>area</code>.
*
* @param java2DValue the Java2D coordinate.
* @param area the area.
* @param edge the edge that the axis belongs to.
*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -