timeseries1.add(new Month(7, 2002), 101.6D);
TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();
timeseriescollection.addSeries(timeseries);
timeseriescollection.addSeries(timeseries1);
timeseriescollection.setDomainIsPointsInTime(true); //domain軸上的刻度點代表的是時間點而不是時間段
return timeseriescollection;
}
2、由ChartFactory 產生 JFreeChart 對象
private static JFreeChart createChart(XYDataset xydataset)
{
JFreeChart jfreechart = ChartFactory.createTimeSeriesChart(”Legal & General Unit Trust Prices”,
“Date”,
“Price Per Unit”,
xydataset,
true,
true,
false);
jfreechart.setBackgroundPaint(Color.white);
XYPlot xyplot = (XYPlot)jfreechart.getPlot(); //獲得 plot : XYPlot!!
xyplot.setBackgroundPaint(Color.lightGray);
xyplot.setDomainGridlinePaint(Color.white);
xyplot.setRangeGridlinePaint(Color.white);
xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D));
xyplot.setDomainCrosshairVisible(true);
xyplot.setRangeCrosshairVisible(true);
org.jfree.chart.renderer.xy.XYItemRenderer xyitemrenderer = xyplot.getRenderer();
if(xyitemrenderer instanceof XYLineAndShapeRenderer)
{
XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyitemrenderer;
xylineandshaperenderer.setDefaultShapesVisible(true); //數據點可見
xylineandshaperenderer.setDefaultShapesFilled(true); //數據點是實心點
}
DateAxis dateaxis = (DateAxis)xyplot.getDomainAxis(); //對domain 軸上日期顯示格式定義
dateaxis.setDateFormatOverride(new SimpleDateFormat(”MMM-yyyy”));
return jfreechart;
}
一些重要的方法:
A、增加標記線:
xyplot.addRangeMarker(new ValueMarker(550D)); //數值軸
Quarter quarter = new Quarter(2, 2002);
xyplot.addDomainMarker(new ValueMarker(quarter.getMiddleMillisecond())); //時間軸
B、數據點的調整
XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();
xylineandshaperenderer.setDefaultShapesVisible(true); //數據點可見
xylineandshaperenderer.setSeriesFillPaint(0, Color.red); //數據點填充爲紅色
xylineandshaperenderer.setSeriesFillPaint(1, Color.white); //數據點填充爲白色
xylineandshaperenderer.setUseFillPaint(true); //應用
C、平均值曲線
這個曲線有什麼用呢?很簡單的例子,這裏有一個以半年每天爲單位的數據繪製的曲線,我們想看看以月爲單位數據
的變化,這時就可以用到它了。
TimeSeries timeseries = createEURTimeSeries(); //就是以半年每天爲單位的數據
TimeSeries timeseries1 = MovingAverage.createMovingAverage(timeseries,
“30 day moving average”,
30, //30天爲一個週期
30); //最開始的30天跳過
TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();
timeseriescollection.addSeries(timeseries);
timeseriescollection.addSeries(timeseries1);
return timeseriescollection;
九、總結一下
dataset plot renderer
餅圖 PieDataset(DefaultPieDataset) PiePlot ——
柱狀圖 CatagoryDataset(DefaultCategoryDataset) CategoryPlot BarRenderer
折線圖 CatagoryDataset(DefaultCategoryDataset) CategoryPlot LineAndShapeRenderer
XYDataset(XYSeriesCollection) XYPlot XYLineAndShapeRenderer
時間序列圖 XYDataset (TimeSeriesCollection) XYPlot XYLineAndShapeRenderer
這裏只是一些常用的方法,具體還是看API
十、Item Lable
這裏以柱狀圖爲例說明,具體來說就是在每個柱狀上顯示它的數據,具體有下面內容:
A、使 Item Lable 可見
B、調整 Item Lable 的顏色、字體等
C、調整 Item Lable 的位置
D、定製 Item Lable 的內容
1、分配一個 Lable Generator 給 renderer
BarRenderer barrenderer = (BarRenderer)categoryplot.getRenderer();
GategoryLableGenerator generator =new StandardGategoryLableGenerator(
“{2}”, new DecimalFormat(”0.00″) //調整顯示的數字和字符格式
);
barrenderer.setLableGenerator(generator);
2、使 Item Lable 可見
barrenderer.setItemLableVisible(true);
3、調整 Item Lable 的顏色、字體等
barrenderer.setItemLablePaint(Color.red);
barrenderer.setItemLableFont(new Font(”SansSerif”,Font.PLAIN,10));
4、調整 Item Lable 的位置
這裏涉及到一個新的對象 ItemLablePosition , ItemLablePosition的構造函數有兩個或四個參數
public ItemLabelPosition(ItemLabelAnchor itemLabelAnchor,
org.jfree.ui.TextAnchor textAnchor,
org.jfree.ui.TextAnchor rotationAnchor,
double angle)
itemLabelAnchor - Item Lable 的位置 (最重要的!!)
textAnchor - Item Lable裏包含的正文相對於Item Lable 的位置
rotationAnchor - Item Lable裏包含的正文旋轉的位置
angle - 旋轉的角度
ItemLabelPosition itemlabelposition = new ItemLabelPosition(ItemLabelAnchor.INSIDE12,
TextAnchor.CENTER_RIGHT,
TextAnchor.CENTER_RIGHT,
-1.57D);
barrenderer.setPositiveItemLabelPosition(itemlabelposition);
這樣就可以每個柱狀上顯示它的數據了,當然可以定製 Item Lable 的內容,比如 Item Lable text 超過100的才顯示,這樣就需要定製自己的類,它要實現GategoryLableGenerator 接口,實現generateItemLable()方法
其他說明:
//設置Legend的位置
//((JFreeChart) chart).getLegend().setPosition(RectangleEdge.RIGHT);
//設置最高的一個 Item 與圖片頂端的距離
plot.getRangeAxis().setUpperMargin(0.15);
//設置最低的一個 Item 與圖片底端的距離
plot.getRangeAxis().setLowerMargin(0.15);
//座標軸字體
plot.getDomainAxis().setLabelFont(new Font("宋體", Font.PLAIN, 12));
//橫軸每個分類的字體
plot.getDomainAxis().setTickLabelFont(new Font("宋體", Font.BOLD, 12));
if(labelPositionsUP_45)
plot.getDomainAxis().setCategoryLabelPositions(CategoryLabelPositions.UP_45);
//柱圖列寬度((BarRenderer) plot.getRenderer()).setMaximumBarWidth(barWidth);
2
我想用jfreechart做一個折線圖,要求橫軸是日1期,豎軸是數量。橫軸日期爲每個月的所有天數。如1月是1-31日,則頁面上是31個點的折線圖。根據每個月天數不同橫軸座標有不同的天數,問怎樣實現?有樣例代碼也可以。謝謝了。
你的折線圖只有一條線?線上有31個點?
給你一個例子,參考着改改就行了。jfc_0.9
package org.jfree.chart.demo;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Polygon;
import java.awt.Shape;
import java.awt.geom.Rectangle2D;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.DefaultDrawingSupplier;
import org.jfree.chart.plot.DrawingSupplier;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
字串4
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
/**
* A line chart demo showing the use of a custom drawing supplier.
*
*/
public class LineChartDemo5 extends ApplicationFrame {
/**
* Creates a new demo.
*
* @param title the frame title.
*/
public LineChartDemo5(final String title) {
super(title);
final CategoryDataset dataset = createDataset();
final JFreeChart chart = createChart(dataset);
final ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
setContentPane(chartPanel);
}
/**
* Creates a sample dataset.
*
* @return a sample dataset.
*/
private CategoryDataset createDataset() {
// row keys...
final String series1 = "First";
final String series2 = "Second";
字串4
final String series3 = "Third";
// column keys...
final String type1 = "Type 1";
final String type2 = "Type 2";
final String type3 = "Type 3";
final String type4 = "Type 4";
final String type5 = "Type 5";
final String type6 = "Type 6";
final String type7 = "Type 7";
final String type8 = "Type 8";
// create the dataset...
final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(1.0, series1, type1);
dataset.addValue(4.0, series1, type2);
dataset.addValue(3.0, series1, type3);
dataset.addValue(5.0, series1, type4);
dataset.addValue(5.0, series1, type5);
dataset.addValue(7.0, series1, type6);
dataset.addValue(7.0, series1, type7);
dataset.addValue(8.0, series1, type8);
字串5
dataset.addValue(5.0, series2, type1);
dataset.addValue(7.0, series2, type2);
dataset.addValue(6.0, series2, type3);
dataset.addValue(8.0, series2, type4);
dataset.addValue(4.0, series2, type5);
dataset.addValue(4.0, series2, type6);
dataset.addValue(2.0, series2, type7);
dataset.addValue(1.0, series2, type8);
dataset.addValue(4.0, series3, type1);
dataset.addValue(3.0, series3, type2);
dataset.addValue(2.0, series3, type3);
dataset.addValue(3.0, series3, type4);
dataset.addValue(6.0, series3, type5);
dataset.addValue(3.0, series3, type6);
dataset.addValue(4.0, series3, type7);
dataset.addValue(3.0, series3, type8);
return dataset;
}
/**
* Creates a sample chart.
*
* @param dataset the dataset.
*
* @return a chart. 字串2
*/
private JFreeChart createChart(final CategoryDataset dataset) {
final JFreeChart chart = ChartFactory.createLineChart(
"Line Chart Demo 5", // chart title
"Type", // domain axis label
"Value", // range axis label
dataset, // data
PlotOrientation.VERTICAL, // orientation
true, // include legend
true, // tooltips
false // urls
);
// final StandardLegend legend = (StandardLegend) chart.getLegend();
// legend.setDisplaySeriesShapes(true);
final Shape[] shapes = new Shape[3];
int[] xpoints;
int[] ypoints;
// right-pointing triangle
3
/****
* 獲取一個演示用的組合數據集對象 (時間曲線圖)
* @return
*/
private static XYDataset createDataset()
{
TimePeriodValues timeseries1 = new TimePeriodValues("Chart Title");
//這地方可以使用循環,把x軸,y軸 的值 輔給timeseries1
TimePeriodValuesCollection timeseriescollection = new TimePeriodValuesCollection();
for(int i =1;i<10;i++)
{
Minute min = new Minute(new Date());
timeseries1.add(min, i);
timeseriescollection.addSeries(timeseries1);
}
return timeseriescollection;
}