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个数以及位置,如调成居中

解决方案 »

  1.   

    这个问题得查jfreechat 的API文档
      

  2.   

    1.不知道是否能控制x轴显示的lable个数你在往TimeSeries 添加数据时可以控制数量 
      

  3.   

    不知道是否能调整lable个数以及位置,如调成居中
      

  4.   

    目前还没接触到jfreechar,听说是做报表的吧,希望能早点接触到
      

  5.   

    plot.getCategoryAxis()
    设置CategoryAxis属性应该可以,建议你看看API吧,要不多试试,我也没做过时序图,
    时序图本来就会有截断的吧,这又不是bug
      

  6.   

    我用的是jfreechart1.09版本的,网上找了很久,同时也看了半天的API,都没找到哪个参数可以设置坐标轴上数据显示间隔的
    例如,横坐标上的数据为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,欢迎大家测试 
      

  7.   


    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]