使用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;
}
}