JFreeChart筆記 (七) 時間序列圖:值標記線
在一些比如說產量、銷售額等的圖表中常常會涉及到一個預期值或者目標值,這種值標記線如何在圖表中畫出來呢?這一節將教給大家值標記線的畫法。
先看效果圖:
實現程式碼如下,關鍵部分已標出:
Java程式碼-
package lw.release.s1TimeSeries;
-
import java.awt.Color;
-
import java.awt.Dimension;
-
import java.awt.Font;
-
import java.text.SimpleDateFormat;
-
import javax.swing.BorderFactory;
-
import javax.swing.JPanel;
-
import javax.swing.border.CompoundBorder;
-
import org.jfree.chart.ChartFactory;
-
import org.jfree.chart.ChartPanel;
-
import org.jfree.chart.JFreeChart;
-
import org.jfree.chart.StandardChartTheme;
-
import org.jfree.chart.axis.DateAxis;
-
import org.jfree.chart.axis.DateTickUnit;
-
import org.jfree.chart.axis.DateTickUnitType;
-
import org.jfree.chart.plot.ValueMarker;
-
import org.jfree.chart.plot.XYPlot;
-
import org.jfree.chart.renderer.xy.XYItemRenderer;
-
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
-
import org.jfree.data.time.Month;
-
import
-
import org.jfree.data.time.TimeSeries;
-
import org.jfree.data.time.TimeSeriesCollection;
-
import org.jfree.data.xy.XYDataset;
-
import org.jfree.ui.ApplicationFrame;
-
import org.jfree.ui.RectangleAnchor;
-
import org.jfree.ui.RefineryUtilities;
-
import org.jfree.ui.TextAnchor;
-
import lw.release.ChartBasePanel;
-
/**
-
* 時間序列圖:值標記線
-
* 新增功能點:
-
* ① 圖表中增加一條值標記線,可以作為銷售額、產量等的目標值等
-
* @author 劉偉 2012-10-26
-
* 樓主辛勤整理,無私免費提供給大家觀看,體惜樓主辛苦,轉載時請註明出處:http://lw2078.iteye.com/
-
* */
-
@SuppressWarnings("serial")
-
public class TimeSeries06 extends ApplicationFrame {
-
public TimeSeries06(String title) {
-
super(title);
-
setContentPane(new TimeSeriesPanel());
-
}
-
public JPanel createDemoPanel() {
-
return new TimeSeriesPanel();
-
}
-
public static void main(String[] arg) {
-
TimeSeries06 timeSeries = new TimeSeries06("值標記線示例圖");
-
timeSeries.pack();
-
RefineryUtilities.centerFrameOnScreen(timeSeries);
-
timeSeries.setVisible(true);
-
}
-
/**
-
* 顯示該Demo圖表的容器
-
* ChartBasePanel類是Swing框架下所有例子共同使用的,這裡不重複貼出
-
* 這個類原始碼在:http://lw2078.iteye.com/blog/1705637
-
* */
-
private class TimeSeriesPanel extends ChartBasePanel {
-
private TimeSeries series; // 間隔定長時間(如年、月、日、時、分、秒等)的資料序列
-
private ChartPanel chartPanel;
-
private JFreeChart chart = createChart(); // 建立一個JFreeChart時間序列圖表
-
public TimeSeriesPanel() {
-
super();
-
addChart(this.chart); // 將此JFreeChart加入JFreeChart列表中
-
// 將JFreeChart放在專用的圖表容器ChartPanel中
-
this.chartPanel = new ChartPanel(this.chart);
-
this.chartPanel.setPreferredSize(new Dimension(600, 250));
-
// 設定chartPanel容器邊框
-
CompoundBorder compoundBorder = BorderFactory.createCompoundBorder(
-
BorderFactory.createEmptyBorder(4, 4,4, 4),
-
BorderFactory.createEtchedBorder());
-
this.chartPanel.setBorder(compoundBorder);
-
// 將chartPanel加入到本容器中
-
add(this.chartPanel);
-
}
-
/**
-
* 建立jfreechart圖表
-
* */
-
private JFreeChart createChart() {
-
// 生成圖表資料集合
-
XYDataset xyDataset = createDataset();
-
// 增加漢字支援
-
//建立主題樣式
-
StandardChartTheme standardChartTheme=new StandardChartTheme("CN");
-
//設定標題字型
-
standardChartTheme.setExtraLargeFont(new Font("隸書",Font.BOLD,20));
-
//設定圖例的字型
-
standardChartTheme.setRegularFont(new Font("SimSun",Font.PLAIN,15));
-
//設定軸向的字型
-
standardChartTheme.setLargeFont(new Font("宋體",Font.PLAIN,15));
-
ChartFactory.setChartTheme(standardChartTheme); //應用主題樣式
-
// 建立一個時間序列圖表的JFreeChart
-
JFreeChart jFreeChart = ChartFactory.createTimeSeriesChart(
-
"值標記線示例圖", // 圖表名
-
"時間", // 橫軸標籤文字
-
"數值", // 縱軸標籤文字
-
xyDataset, // 圖表的資料集合
-
true, // 是否顯示圖表中每條資料序列的說明
-
false, // 是否顯示工具提示
-
false); // 是否顯示圖表中設定的url網路連線
-
// XYPlot圖表區域的設定物件,用來設定圖表的一些顯示屬性
-
XYPlot xyPlot = (XYPlot) jFreeChart.getPlot();
-
// 設定資料點和序列線的顯示格式
-
XYItemRenderer r = xyPlot.getRenderer();
-
if (r instanceof XYLineAndShapeRenderer) {
-
XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) r;
-
renderer.setBaseShapesVisible(true); // 資料點顯示外框
-
renderer.setBaseShapesFilled(true); // 資料點外框內填充
-
}
-
////////////////////////// 新功能點 ////////////////////////////////////
-
// 設定值標記線
-
ValueMarker valueMarker = new ValueMarker(100.0D);
-
valueMarker.setPaint(Color.blue); // 值標記線顏色
-
valueMarker.setAlpha(0.9F); // 值標記線透明度
-
valueMarker.setLabel("目標值"); // 值標記線顯示的文字
-
valueMarker.setLabelPaint(Color.BLUE); // 值標記線顯示的文字的顏色
-
// 值標記線顯示的文字的字型
-
valueMarker.setLabelFont(new Font("宋體",Font.PLAIN,12));
-
valueMarker.setLabelAnchor(RectangleAnchor.LEFT);
-
// 值標記線在顯示的文字的下方左端
-
valueMarker.setLabelTextAnchor(TextAnchor.BOTTOM_LEFT);
-
xyPlot.addRangeMarker(valueMarker); // 在圖表中使用自定義的值標記線
-
//////////////////////////////////////////////////////////////////
-
// 設定X時間軸按月顯示,時間間隔為1個月
-
// DateAxis是X時間軸線的顯示樣式設定物件
-
DateAxis dateAxis=(DateAxis)xyPlot.getDomainAxis();
-
SimpleDateFormat frm = new SimpleDateFormat("MM月"); // 設定時間顯示樣式
-
// 設定顯示時間間隔為1年
-
dateAxis.setTickUnit(new DateTickUnit(DateTickUnitType.MONTH, 1, frm));
-
return jFreeChart;
-
}
-
/**
-
* 建立jfreechart圖表所用的資料集合
-
* @return
-
*/
-
private XYDataset createDataset() {
-
// 生成資料序列
-
this.series = new TimeSeries("產量");
-
// 以月為時間單位,從2011年1月開始,隨機產生12個月的模擬資料
-
setSeriesData(series, 100, new Month(1,2011), 12);
-
// 將兩條資料序列都放在一個數據集合中
-
TimeSeriesCollection dataset = new TimeSeriesCollection();
-
dataset.addSeries(this.series);
-
return dataset;
-
}
-
/**
-
* 隨機生成資料,自動定位到時間序列上的下一個時間點,將新資料點加入到資料序列中
-
* @param series 資料序列物件
-
* @param baseData 生成的隨機資料的基準值
-
* @param regularTime 定長的時間間隔(年、月、日、時、分、秒等)
-
* @param sampleNum 生成的資料點個數
-
*/
-
private void setSeriesData(TimeSeries series, double baseData,
-
RegularTimePeriod regularTime, int sampleNum) {
-
// 生成隨機模擬資料
-
double value = baseData;
-
for (int i = 0; i < sampleNum; i++) {
-
series.add(regularTime, value);
-
regularTime = regularTime.next(); //自動定位到下一個時間點
-
<