读书人

使用JFreeChart的XYSplineRenderer画平

发布时间: 2012-12-15 15:16:03 作者: rapoo

使用JFreeChart的XYSplineRenderer画平滑曲线的问题=。=求大神帮帮忙
本来只是想让已经做好的折线图平滑一点,在网上找来找去发现了XYSplineRenderer这个类,然后就开始改:

原图:


研究了半天,改成这样了:



这是现在改完后的代码,很多地方都只是注释掉,没去删,有点乱,见谅:

package lianxi;

import java.awt.BasicStroke;
import java.awt.Color;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYSplineRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;

public class DockApplet extends ApplicationFrame {

private static final long serialVersionUID = 1L;

public DockApplet(String s) {

super(s);

setContentPane(createDemoLine());

}

public static void main(String[] args) {

DockApplet fjc = new DockApplet("曲线图");

fjc.pack();

RefineryUtilities.centerFrameOnScreen(fjc);

fjc.setVisible(true);

}

// 生成显示图表的面板

public static JPanel createDemoLine() {

JFreeChart jfreechart = createChart(createDataset());

return new ChartPanel(jfreechart);

}

// 生成图表主对象JFreeChart

public static JFreeChart createChart(XYDataset linedataset) {

XYSplineRenderer splinerenderer = new XYSplineRenderer();

//splinerenderer.setBaseShapesVisible(false); //绘制的线条上不显示图例,如果显示的话,会使图片变得很丑陋
//splinerenderer.setSeriesPaint(0, Color.yellow); //设置0号数据的颜色。这是手工设置线条颜色的方法
//splinerenderer.setPrecision(5); //设置精度,大概意思是在源数据两个点之间插入5个点以拟合出一条平滑曲线

splinerenderer.setSeriesStroke(0, new BasicStroke(4.0F, 1, 1, 1.0F));

//splinerenderer.setSeriesStroke(1, new BasicStroke(2.0F, 1, 1, 1.0F,
//new float[] { 10F, 6F }, 0.0F));
//splinerenderer.setSeriesStroke(2, new BasicStroke(2.0F, 1, 1, 1.0F,
//new float[] { 10F, 6F }, 0.0F));
//设置线


//create plot
NumberAxis xAxis = new NumberAxis("切变率(1/s)");
xAxis.setAutoRangeIncludesZero(false);
NumberAxis yAxis = new NumberAxis("粘度(mPa.s)");
yAxis.setAutoRangeIncludesZero(false);

XYPlot plot = new XYPlot(createDataset(), xAxis, yAxis, splinerenderer);
// x轴 // 分类轴网格是否可见
plot.setDomainGridlinesVisible(true);
// y轴 //数据轴网格是否可见
plot.setRangeGridlinesVisible(true);
// 是否显示格子线
plot.setRangeGridlinesVisible(true);
// 设置背景透明度
plot.setBackgroundAlpha(0.3f);
// 数据轴(y轴)色彩
plot.setRangeGridlinePaint(Color.black);
// 分类轴(x轴)色彩
plot.setDomainGridlinePaint(Color.black);



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

rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

rangeAxis.setAutoRangeIncludesZero(true);

rangeAxis.setUpperMargin(0.20);

rangeAxis.setLabelAngle(Math.PI / 2.0);



JFreeChart chart = new JFreeChart("细胞电压图", //标题
JFreeChart.DEFAULT_TITLE_FONT, //标题的字体,这样就可以解决中文乱码的问题
plot,
true
);

//// 定义图表对象

//JFreeChart chart = ChartFactory.createXYLineChart("曲线图", // 曲线图名称
//
//"切变率(1/s)", // 横坐标名称
//
//"粘度(mPa.s)", // 纵坐标名称
//
//(XYDataset) linedataset, // 数据
//
//PlotOrientation.VERTICAL, // 水平显示图像
//
//true, // include legend
//
//true, // tooltips
//
//false // urls
//
//);
//
//XYPlot xyplot = chart.getXYPlot();
//// x轴 // 分类轴网格是否可见
//xyplot.setDomainGridlinesVisible(true);
//// y轴 //数据轴网格是否可见
//xyplot.setRangeGridlinesVisible(true);
//
//XYPlot plot = chart.getXYPlot();
//
//plot.setRangeGridlinesVisible(true); // 是否显示格子线
//
//plot.setBackgroundAlpha(0.3f); // 设置背景透明度
//xyplot.setRangeGridlinePaint(Color.black);// 数据轴(y轴)色彩
//
//xyplot.setDomainGridlinePaint(Color.black);// 分类轴(x轴)色彩
//
//// XYSplineRenderer splinerenderer1 = new XYSplineRenderer();
//// splinerenderer1.setBaseShapesVisible(false);// 设置折线中的端点图形是否可见
//XYPlot catplot = chart.getXYPlot(); // 获取柱状图、折线图区域对象
//
//XYSplineRenderer splinerenderer = new XYSplineRenderer();//catplot.getRenderer();
//
//splinerenderer.setBaseShapesVisible(false); //绘制的线条上不显示图例,如果显示的话,会使图片变得很丑陋
//splinerenderer.setSeriesPaint(0, Color.GREEN); //设置0号数据的颜色。这是手工设置线条颜色的方法
//splinerenderer.setPrecision(10); //设置精度,大概意思是在源数据两个点之间插入5个点以拟合出一条平滑曲线
//
//splinerenderer.setSeriesStroke(0, new BasicStroke(4.0F, 1, 1, 1.0F));
//
//splinerenderer.setSeriesStroke(1, new BasicStroke(2.0F, 1, 1, 1.0F,
//new float[] { 10F, 6F }, 0.0F));
//splinerenderer.setSeriesStroke(2, new BasicStroke(2.0F, 1, 1, 1.0F,
//new float[] { 10F, 6F }, 0.0F));
//// 设置第二,三种数据表示为虚线,默认是直线
//
//NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
//
//rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
//
//rangeAxis.setAutoRangeIncludesZero(true);
//
//rangeAxis.setUpperMargin(0.20);
//
//rangeAxis.setLabelAngle(Math.PI / 2.0);

FileOutputStream fos_jpg = null;
try {
try {
fos_jpg = new FileOutputStream("c:\\steelBar.jpg");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
ChartUtilities
.writeChartAsJPEG(fos_jpg, chart, 1000, 800, null);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
fos_jpg.close();
} catch (IOException e) {
// TODO Auto-generated catch block


e.printStackTrace();
}
} finally {
}

return chart;

}

// 生成数据

public static XYDataset createDataset() {

// 横轴名称(列名称)

// String type1 = "1";
//
// String type2 = "5";
//
// String type4 = "30";
//
// String type6 = "200";

// 设置各曲线

XYSeries linedataset1 = new XYSeries("低值");

linedataset1.add(1,13.79);
linedataset1.add(5,6.81);
linedataset1.add(30,4.29);
linedataset1.add(200,3.36);

//XYSeries linedataset2 = new XYSeries("结果");
//
//linedataset2.add(1,20.80);
//linedataset2.add(5,8.55);
//linedataset2.add(30,4.25);
//linedataset2.add(200,3.47);
//
//XYSeries linedataset3 = new XYSeries("高值");
//
//linedataset3.add(1,17.91);
//linedataset3.add(5,8.53);
//linedataset3.add(30,5.45);
//linedataset3.add(200,4.32);

XYSeriesCollection localXYSeriesCollection = new XYSeriesCollection();
localXYSeriesCollection.addSeries(linedataset1);
//localXYSeriesCollection.addSeries(linedataset2);
//localXYSeriesCollection.addSeries(linedataset3);

// String series1 = "低值";
//
// String series2 = "结果";
//
// String series3 = "高值";

// 设置结果
// linedataset.addValue(20.80, series2, type1);
// linedataset.addValue(8.55, series2, type2);
// linedataset.addValue(4.25, series2, type4);
// linedataset.addValue(3.47, series2, type6);
//
// // 设置低值
//
// // 设置高值
// linedataset.addValue(17.91, series3, type1);
// linedataset.addValue(8.53, series3, type2);
// linedataset.addValue(5.45, series3, type4);
// linedataset.addValue(4.32, series3, type6);

return localXYSeriesCollection;

}

}



平滑是平滑了,但是这弧度太夸张了点,还有这个弯曲的方向也不对,网上找了很久也不知道怎么改,只好来求各位大神了,麻烦各位帮帮忙,在线等,急啊~~~~

[最优解释]
楼主设置下线条描绘的精度
splinerenderer.setPrecision(1);
默认是5楼主的数据差值比较小5的话就会超过

[其他解释]

来人啊,救命啊~~~
[其他解释]

都下班了么=0=
[其他解释]

这东西没人懂么?
[其他解释]

额,精度改成1画出来的图和普通的折线图完全没区别了啊,没有达到我想要的平滑效果啊,折点转折太明显了
[其他解释]
那是因为你x轴数据的差值原因
[其他解释]
jfreechart也是根据你x轴的数据差来画出弯曲弧度的,你x轴数据差不是很平均落差太大。
不设置精度的话就会跑出边界了,设置的话又没有弯曲弧度了。
[其他解释]
那我多设置几个X轴上的数据就行了么?我去试试

读书人网 >Java Web开发

热点推荐