您的位置:首页 > 其它

jfreechart 折线图

2016-02-02 10:17 513 查看
第一次上岗工作,头一个任务:用JFreeChart做折线图。网上搜了好多资料,但对于我这个新手来说好像总显得那么深奥,经过两天的整理测试,稍微弄出了点思路,自己记录下,附上我的例子:

我的程序:

public class bloodSugarChart {

public bloodSugarChart() {

this.createChart();

}

// 获得数据集 (这里的数据是为了测试我随便写的一个自动生成数据的例子)

public DefaultCategoryDataset createDataset() {

DefaultCategoryDataset linedataset = new DefaultCategoryDataset();

// 曲线名称

String series = "血糖值"; // series指的就是报表里的那条数据线

//因此 对数据线的相关设置就需要联系到serise

//比如说setSeriesPaint 设置数据线的颜色

// 横轴名称(列名称)

String[] time = new String[15];

String[] timeValue = { "6-1日", "6-2日", "6-3日", "6-4日", "6-5日", "6-6日",

"6-7日", "6-8日", "6-9日", "6-10日", "6-11日", "6-12日", "6-13日",

"6-14日", "6-15日" };

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

time[i] = timeValue[i];

}

//随机添加数据值

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

java.util.Random r = new java.util.Random();

linedataset.addValue(i + i * 9.34 + r.nextLong() % 100, //值

series, //哪条数据线

time[i]); // 对应的横轴

}

return linedataset;

}

// 生成图标对象JFreeChart

/*

*整个大的框架属于JFreeChart

*坐标轴里的属于 Plot 其常用子类有:CategoryPlot, MultiplePiePlot, PiePlot , XYPlot

*

***

*/

public void createChart() {

try {

//定义图标对象

JFreeChart chart = ChartFactory.createLineChart(null,// 报表题目,字符串类型

"采集时间", // 横轴

"血糖值", // 纵轴

this.createDataset(), // 获得数据集

PlotOrientation.VERTICAL, // 图标方向垂直

true, // 显示图例

false, // 不用生成工具

false // 不用生成URL地址

);

//整个大的框架属于chart 可以设置chart的背景颜色

// 生成图形

CategoryPlot plot = chart.getCategoryPlot();

// 图像属性部分

plot.setBackgroundPaint(Color.white);

plot.setDomainGridlinesVisible(true); //设置背景网格线是否可见

plot.setDomainGridlinePaint(Color.BLACK); //设置背景网格线颜色

plot.setRangeGridlinePaint(Color.GRAY);

plot.setNoDataMessage("没有数据");//没有数据时显示的文字说明。

// 数据轴属性部分

NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();

rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

rangeAxis.setAutoRangeIncludesZero(true); //自动生成

rangeAxis.setUpperMargin(0.20);

rangeAxis.setLabelAngle(Math.PI / 2.0);

rangeAxis.setAutoRange(false);

// 数据渲染部分 主要是对折线做操作

LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot

.getRenderer();

renderer.setBaseItemLabelsVisible(true);

renderer.setSeriesPaint(0, Color.black); //设置折线的颜色

renderer.setBaseShapesFilled(true);

renderer.setBaseItemLabelsVisible(true);

renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(

ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));

renderer

.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());

/*

*这里的StandardCategoryItemLabelGenerator()我想强调下:当时这个地*方被搅得头很晕,Standard**ItemLabelGenerator是通用的 因为我创建*的是CategoryPlot 所以很多设置都是Category相关

*而XYPlot 对应的则是 : StandardXYItemLabelGenerator

*/

//对于编程人员 这种根据一种类型方法联想到其他类型相似方法的思

//想是必须有的吧!目前只能慢慢培养了。。

renderer.setBaseItemLabelFont(new Font("Dialog", 1, 14)); //设置提示折点数据形状

plot.setRenderer(renderer);

//区域渲染部分

double lowpress = 4.5;

double uperpress = 8; //设定正常血糖值的范围

IntervalMarker inter = new IntervalMarker(lowpress, uperpress);

inter.setLabelOffsetType(LengthAdjustmentType.EXPAND); // 范围调整——扩张

inter.setPaint(Color.LIGHT_GRAY);// 域顏色

inter.setLabelFont(new Font("SansSerif", 41, 14));

inter.setLabelPaint(Color.RED);

inter.setLabel("正常血糖值范围"); //设定区域说明文字

plot.addRangeMarker(inter,Layer.BACKGROUND); //添加mark到图形 BACKGROUND使得数据折线在区域的前端

// 创建文件输出流

File fos_jpg = new File("E://bloodSugarChart.jpg ");

// 输出到哪个输出流

ChartUtilities.saveChartAsJPEG(fos_jpg, chart, // 统计图表对象

700, // 宽

500 // 高

);

} catch (IOException e) {

e.printStackTrace();

}

}

//测试类

public static void main(String[] args) {

bloodSugarChart my = new bloodSugarChart();

}

}

效果图如下:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: