import java.text.SimpleDateFormat;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;import org.jfree.chart.plot.XYPlot;
import org.jfree.data.time.Day;import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
public class TimeSeriesExample
{
public static void main(String[] args)
{
// 创建第一条时序线
TimeSeries pop1 = new TimeSeries("Population12", Day.class);
pop1.add(new Day(10, 1, 2004), 150); TimeSeries pop2 = new TimeSeries("Population2", Day.class);
pop2.add(new Day(20, 1, 2004), 200);
// 创建一个时序集合
TimeSeriesCollection dataset = new TimeSeriesCollection();
dataset.addSeries(pop1);
dataset.addSeries(pop2);
JFreeChart chart = ChartFactory.createTimeSeriesChart("人口统计时序图","无数据","Population1",dataset,true,true,false);
// 设置日期显示格式
XYPlot plot = chart.getXYPlot();
DateAxis axis = (DateAxis) plot.getDomainAxis();
axis.setDateFormatOverride(new SimpleDateFormat("yyyy-mm-dd hh:mm"));
java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-mm-dd");
try{
// 创建图形显示面板
ChartFrame cf = new ChartFrame("时序图",chart);
cf.pack();
// 设置图片大小
cf.setSize(500,300);
// 设置图形可见
cf.setVisible(true); } catch (Exception e){
System.err.println("Problem occurred creating chart.");
}
}
}
有几个问题啊!
这样做出来的图x轴的坐标有时候太长导致显示不全,不知道是否能控制x轴显示的lable个数
以及位置,如调成居中,之类的,因为有时候虽然x轴只显示两个下标但是由于精确到秒,两个坐标又都顶着两边的头。
所以也出现截断的情况。重复下
两个问题如下:
1.不知道是否能控制x轴显示的lable个数
2.不知道是否能调整lable个数以及位置,如调成居中
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;import org.jfree.chart.plot.XYPlot;
import org.jfree.data.time.Day;import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
public class TimeSeriesExample
{
public static void main(String[] args)
{
// 创建第一条时序线
TimeSeries pop1 = new TimeSeries("Population12", Day.class);
pop1.add(new Day(10, 1, 2004), 150); TimeSeries pop2 = new TimeSeries("Population2", Day.class);
pop2.add(new Day(20, 1, 2004), 200);
// 创建一个时序集合
TimeSeriesCollection dataset = new TimeSeriesCollection();
dataset.addSeries(pop1);
dataset.addSeries(pop2);
JFreeChart chart = ChartFactory.createTimeSeriesChart("人口统计时序图","无数据","Population1",dataset,true,true,false);
// 设置日期显示格式
XYPlot plot = chart.getXYPlot();
DateAxis axis = (DateAxis) plot.getDomainAxis();
axis.setDateFormatOverride(new SimpleDateFormat("yyyy-mm-dd hh:mm"));
java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-mm-dd");
try{
// 创建图形显示面板
ChartFrame cf = new ChartFrame("时序图",chart);
cf.pack();
// 设置图片大小
cf.setSize(500,300);
// 设置图形可见
cf.setVisible(true); } catch (Exception e){
System.err.println("Problem occurred creating chart.");
}
}
}
有几个问题啊!
这样做出来的图x轴的坐标有时候太长导致显示不全,不知道是否能控制x轴显示的lable个数
以及位置,如调成居中,之类的,因为有时候虽然x轴只显示两个下标但是由于精确到秒,两个坐标又都顶着两边的头。
所以也出现截断的情况。重复下
两个问题如下:
1.不知道是否能控制x轴显示的lable个数
2.不知道是否能调整lable个数以及位置,如调成居中
设置CategoryAxis属性应该可以,建议你看看API吧,要不多试试,我也没做过时序图,
时序图本来就会有截断的吧,这又不是bug
例如,横坐标上的数据为10个
2000年 2001年 2002年 ... 2009年
但是我只想显示 2000年 2003年 2006年 2009年于是开始看jfreechart源码,其实很简单
修改 org.jfree.chart.axis.CategoryAxis
添加属性
...
/** add by winston 20091008 to settle the axis label too much problem */
private int tickLabelAlter = 1;
public int getTickLabelAlter() {
return tickLabelAlter;
}
public void setTickLabelAlter(int tickLabelAlter) {
this.tickLabelAlter = tickLabelAlter;
}
...修改方法
protected AxisState drawCategoryLabels()
...
while (iterator.hasNext()) {
CategoryTick tick = (CategoryTick) iterator.next();
//add by winston 20091008 to settle the axis label too much problem
if(categoryIndex % this.tickLabelAlter != 0){
categoryIndex ++;
continue;
}
g2.setFont(getTickLabelFont(tick.getCategory()));
...显示时只需要修改tickLabelAlter属性,就可以间隔显示呵呵,水平有限!加上项目急用,只是做了简单的测试,没经过大量测试,可能会引起bug,欢迎大家测试
JFreeChart的绘图过程是这样的:最终目的是得到一个Image,要得到一个image,就得调用JfreeChart.draw()方法,在这个draw()方法里又去调用Plot(封装的数据结构)的draw()方法,在这个方法里,JfreeChart会计算绘制Chart需要的平面大小(width和height以及相关属性);在这里你可以自定义一个plot,用个变量记录下这个width值,然后在调用ChartUtilities.writeChartAsJPEG(OutputStream out, float quality, JFreeChart chart, int width, int height, ChartRenderingInfo info)时给定这个width值就可以了。1.不知道是否能控制x轴显示的lable个数:不知道你说的控制是什么意思,但按以上方法就可以将所有的label都显示出来,而其效果还不错;
2.不知道是否能调整lable个数以及位置,如调成居中:这个到可以,你也可以尝试将label的现实设置为vertical(categoryAxis.setCategoryLabelPositions(CategoryLabelPositions
.createUpRotationLabelPositions(Math.PI / 2));)刚经历的这个项目就用到了JFreeChart,也研究了一段时间,上面说的可能不是很清楚,可以交流([email protected])