遇到用jfreechart 画多轴图,我现在要在一个坐标上画两纵轴,位置一左一右,共享一个横轴,不知道怎么办?大家有没有好的办法,希望能把源代码贴出来下,在线等

解决方案 »

  1.   

    你这个要求不能直接实现,因为平面图只能体现二维的数据。但是你可以通过变通的方法实现,就是用jfreechart中的combined plotpackage jfreechart.demo;import java.awt.Dimension;
    import java.awt.Font;
    import java.util.Random;
    import javax.swing.JPanel;
    import org.jfree.chart.ChartPanel;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.axis.CategoryAxis;
    import org.jfree.chart.axis.NumberAxis;
    import org.jfree.chart.labels.StandardCategoryToolTipGenerator;
    import org.jfree.chart.plot.CategoryPlot;
    import org.jfree.chart.plot.CombinedDomainCategoryPlot;
    import org.jfree.chart.renderer.category.AbstractCategoryItemRenderer;
    import org.jfree.chart.renderer.category.BarRenderer;
    import org.jfree.chart.renderer.category.LineAndShapeRenderer;
    import org.jfree.data.category.CategoryDataset;
    import org.jfree.data.category.DefaultCategoryDataset;
    import org.jfree.ui.ApplicationFrame;
    import org.jfree.ui.RefineryUtilities;public class CombinedCategoryPlotDemo1 extends ApplicationFrame
    {
    private static String[] category = new String[]
    { "Type1", "Type2", "Type3", "Type4",
    "Type5", "Type6", "Typ7", "Type8" }; public CombinedCategoryPlotDemo1(String title)
    {
    super(title);
    JFreeChart result = createChart(createSubPlot("line", 8, new String[]
    { "First", "Second" }, category), createSubPlot("bar", 20, new String[]
    { "Third", "Fourth" }, category));
    ChartPanel chartPanel = new ChartPanel(result);
    chartPanel.setPreferredSize(new Dimension(500, 270));
    setContentPane(chartPanel);
    } private static CategoryDataset createDataset(int seed, String[] series,
    String[] category)
    {
    DefaultCategoryDataset dataset = new DefaultCategoryDataset();
    Random r = new Random();
    for (int i = 0; i < series.length; i++)
    {
    for (int j = 0; j < category.length; j++)
    {
    int tmp=r.nextInt(seed);
    while(tmp==0)
    tmp=r.nextInt(seed);
    dataset.addValue(tmp, series[i], category[j]);
    }
    }
    return dataset;
    } private static CategoryPlot createSubPlot(String type, int seed,
    String[] series, String[] category)
    {
    CategoryDataset dataset = createDataset(seed, series, category);
    AbstractCategoryItemRenderer renderer = null;
    if ("line".equals(type))
    renderer = new LineAndShapeRenderer();
    else if ("bar".equals(type))
    renderer = new BarRenderer();
    NumberAxis rangeAxis = new NumberAxis("Value");
    rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
    renderer
    .setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());
    CategoryPlot plot = new CategoryPlot(dataset, null, rangeAxis, renderer);
    plot.setDomainGridlinesVisible(true);
    return plot;
    } private static JFreeChart createChart(CategoryPlot plot1, CategoryPlot plot2)
    {
    CategoryAxis domainAxis = new CategoryAxis("Category");
    CombinedDomainCategoryPlot plot = new CombinedDomainCategoryPlot(
    domainAxis);
    plot.add(plot1, 2);
    plot.add(plot2, 1);
    plot.setDomainGridlinesVisible(true);
    JFreeChart chart = new JFreeChart("Combined Domain Category Plot Demo",
    new Font("SansSerif", Font.BOLD, 12), plot, true);
    return chart;
    } public static JPanel createDemoPanel()
    {
    JFreeChart chart = createChart(createSubPlot("line", 8, new String[]
    { "First", "Second" }, category), createSubPlot("bar", 20, new String[]
    { "Third", "Fourth" }, category));
    return new ChartPanel(chart);
    } public static String getDemoDescription()
    {
    return "A Combined Domain Category Plot.";
    } public static void main(String[] args)
    {
    CombinedCategoryPlotDemo1 demo = new CombinedCategoryPlotDemo1(
    "Combined Category Plot Demo 1");
    demo.pack();
    RefineryUtilities.centerFrameOnScreen(demo);
    demo.setVisible(true);
    }
    }
      

  2.   

    另外一个
    package jfreechart.demo;import java.awt.Dimension;
    import java.text.DecimalFormat;
    import java.text.SimpleDateFormat;
    import java.util.Random;
    import javax.swing.JPanel;
    import org.jfree.chart.ChartPanel;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.axis.DateAxis;
    import org.jfree.chart.axis.NumberAxis;
    import org.jfree.chart.labels.StandardXYToolTipGenerator;
    import org.jfree.chart.plot.CombinedRangeXYPlot;
    import org.jfree.chart.plot.XYPlot;
    import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
    import org.jfree.chart.renderer.xy.XYBarRenderer;
    import org.jfree.chart.renderer.xy.XYItemRenderer;
    import org.jfree.data.time.Day;
    import org.jfree.data.time.TimeSeries;
    import org.jfree.data.time.TimeSeriesCollection;
    import org.jfree.data.xy.XYDataset;
    import org.jfree.ui.ApplicationFrame;
    import org.jfree.ui.RefineryUtilities;public class CombinedXYPlotDemo2 extends ApplicationFrame
    {
    public CombinedXYPlotDemo2(String title)
    {
    super(title);
    JFreeChart chart = createChart();
    ChartPanel chartPanel = new ChartPanel(chart);
    chartPanel.setPreferredSize(new Dimension(500, 270));
    setContentPane(chartPanel);
    } public static JPanel createDemoPanel()
    {
    JFreeChart chart = createChart();
    return new ChartPanel(chart);
    } public static String getDemoDescription()
    {
    return "A Combined range XY Plot.";
    } public static void main(String[] args)
    {
    CombinedXYPlotDemo2 demo = new CombinedXYPlotDemo2(
    "Combined XY Plot Demo");
    demo.pack();
    RefineryUtilities.centerFrameOnScreen(demo);
    demo.setVisible(true);
    } private static JFreeChart createChart()
    {
    CombinedRangeXYPlot plot = new CombinedRangeXYPlot(new NumberAxis(
    "Value"));
    plot.add(createSubPlot("bar"), 1);
    plot.add(createSubPlot("line"), 1);
    return new JFreeChart("Combined (Range) XY Plot",
    JFreeChart.DEFAULT_TITLE_FONT, plot, true);
    } private static XYPlot createSubPlot(String type)
    {
    XYItemRenderer renderer = null;
    XYDataset dataset = createDataset(type);
    if ("bar".equals(type))
    renderer = new XYBarRenderer(0.20);
    else if ("line".equals(type))
    renderer = new StandardXYItemRenderer();
    renderer
    .setToolTipGenerator(new StandardXYToolTipGenerator("{2}",
    new SimpleDateFormat("d-MM-yyyy"), new DecimalFormat(
    "0,000.0")));
    XYPlot subPlot = new XYPlot(dataset, new DateAxis("Date"), null,
    renderer);
    return subPlot;
    } private static XYDataset createDataset(String type)
    {
    TimeSeries s1 = new TimeSeries("L&G", Day.class);
    Random r = new Random();
    s1.add(new Day(1, 9, 2000), r.nextInt(2000));
    s1.add(new Day(2, 9, 2000), r.nextInt(2000));
    s1.add(new Day(3, 9, 2000), r.nextInt(2000));
    s1.add(new Day(4, 9, 2000), r.nextInt(2000));
    s1.add(new Day(5, 9, 2000), r.nextInt(2000));
    s1.add(new Day(6, 9, 2000), r.nextInt(2000));
    s1.add(new Day(7, 9, 2000), r.nextInt(2000));
    s1.add(new Day(8, 9, 2000), r.nextInt(2000));
    s1.add(new Day(9, 9, 2000), r.nextInt(2000));
    s1.add(new Day(10, 9, 2000), r.nextInt(2000));
    s1.add(new Day(11, 9, 2000), r.nextInt(2000));
    s1.add(new Day(12, 9, 2000), r.nextInt(2000));
    s1.add(new Day(13, 9, 2000), r.nextInt(2000));
    s1.add(new Day(14, 9, 2000), r.nextInt(2000));
    s1.add(new Day(15, 9, 2000), r.nextInt(2000));
    s1.add(new Day(16, 9, 2000), r.nextInt(2000));
    s1.add(new Day(17, 9, 2000), r.nextInt(2000));
    s1.add(new Day(18, 9, 2000), r.nextInt(2000));
    s1.add(new Day(19, 9, 2000), r.nextInt(2000));
    s1.add(new Day(20, 9, 2000), r.nextInt(2000));
    s1.add(new Day(21, 9, 2000), r.nextInt(2000));
    s1.add(new Day(22, 9, 2000), r.nextInt(2000));
    s1.add(new Day(23, 9, 2000), r.nextInt(2000));
    s1.add(new Day(24, 9, 2000), r.nextInt(2000));
    s1.add(new Day(25, 9, 2000), r.nextInt(2000));
    s1.add(new Day(26, 9, 2000), r.nextInt(2000));
    s1.add(new Day(27, 9, 2000), r.nextInt(2000));
    s1.add(new Day(28, 9, 2000), r.nextInt(2000));
    s1.add(new Day(29, 9, 2000), r.nextInt(2000));
    s1.add(new Day(30, 9, 2000), r.nextInt(2000));
    TimeSeriesCollection dataset = new TimeSeriesCollection();
    dataset.addSeries(s1);
    return dataset;
    }
    }
      

  3.   

    兄台的这个答案对我来说不是很完美啊
    我看了jfreechart的官方网站,它上面就有我说的例子,平面坐标轴上有两个横轴
      

  4.   

    把他例子的类下载下来就可以了!你在google上搜索类名嘛,肯定有的!
      

  5.   

    我明白你的意思了。下面的这个例子应该能满足你的要求package jfreechart.demo;import java.awt.Color;
    import java.awt.Dimension;
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartPanel;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.axis.AxisLocation;
    import org.jfree.chart.axis.CategoryAxis;
    import org.jfree.chart.axis.CategoryLabelPositions;
    import org.jfree.chart.axis.NumberAxis;
    import org.jfree.chart.axis.ValueAxis;
    import org.jfree.chart.labels.StandardCategoryToolTipGenerator;
    import org.jfree.chart.plot.CategoryPlot;
    import org.jfree.chart.plot.DatasetRenderingOrder;
    import org.jfree.chart.plot.PlotOrientation;
    import org.jfree.chart.renderer.category.LineAndShapeRenderer;
    import org.jfree.data.category.CategoryDataset;
    import org.jfree.data.category.DefaultCategoryDataset;
    import org.jfree.ui.ApplicationFrame;
    import org.jfree.ui.RefineryUtilities;public class DualAxisDemo extends ApplicationFrame
    {
    public DualAxisDemo(final String title)
    {
    super(title);
    final CategoryDataset dataset1 = createDataset1();
    final JFreeChart chart = ChartFactory.createBarChart("Dual Axis Chart",
    "Category", "Value", dataset1, PlotOrientation.VERTICAL, true,
    true, false);
    chart.setBackgroundPaint(Color.white);
    final CategoryPlot plot = chart.getCategoryPlot();
    plot.setBackgroundPaint(new Color(0xEE, 0xEE, 0xFF));
    plot.setDomainAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);
    final CategoryDataset dataset2 = createDataset2();
    plot.setDataset(1, dataset2);
    plot.mapDatasetToRangeAxis(1, 1);
    final CategoryAxis domainAxis = plot.getDomainAxis();
    domainAxis.setCategoryLabelPositions(CategoryLabelPositions.DOWN_45);
    final ValueAxis axis2 = new NumberAxis("Secondary");
    plot.setRangeAxis(1, axis2);
    final LineAndShapeRenderer renderer2 = new LineAndShapeRenderer();
    renderer2.setToolTipGenerator(new StandardCategoryToolTipGenerator());
    plot.setRenderer(1, renderer2);
    plot.setDatasetRenderingOrder(DatasetRenderingOrder.REVERSE);
    final ChartPanel chartPanel = new ChartPanel(chart);
    chartPanel.setPreferredSize(new Dimension(500, 270));
    setContentPane(chartPanel);
    } private CategoryDataset createDataset1()
    {
    // row keys...
    final String series1 = "First";
    final String series2 = "Second";
    final String series3 = "Third";
    // column keys...
    final String category1 = "Category 1";
    final String category2 = "Category 2";
    final String category3 = "Category 3";
    final String category4 = "Category 4";
    final String category5 = "Category 5";
    final String category6 = "Category 6";
    final String category7 = "Category 7";
    final String category8 = "Category 8";
    // create the dataset...
    final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
    dataset.addValue(1.0, series1, category1);
    dataset.addValue(4.0, series1, category2);
    dataset.addValue(3.0, series1, category3);
    dataset.addValue(5.0, series1, category4);
    dataset.addValue(5.0, series1, category5);
    dataset.addValue(7.0, series1, category6);
    dataset.addValue(7.0, series1, category7);
    dataset.addValue(8.0, series1, category8);
    dataset.addValue(5.0, series2, category1);
    dataset.addValue(7.0, series2, category2);
    dataset.addValue(6.0, series2, category3);
    dataset.addValue(8.0, series2, category4);
    dataset.addValue(4.0, series2, category5);
    dataset.addValue(4.0, series2, category6);
    dataset.addValue(2.0, series2, category7);
    dataset.addValue(1.0, series2, category8);
    dataset.addValue(4.0, series3, category1);
    dataset.addValue(3.0, series3, category2);
    dataset.addValue(2.0, series3, category3);
    dataset.addValue(3.0, series3, category4);
    dataset.addValue(6.0, series3, category5);
    dataset.addValue(3.0, series3, category6);
    dataset.addValue(4.0, series3, category7);
    dataset.addValue(3.0, series3, category8);
    return dataset;
    } private CategoryDataset createDataset2()
    {
    // row keys...
    final String series1 = "Fourth";
    // column keys...
    final String category1 = "Category 1";
    final String category2 = "Category 2";
    final String category3 = "Category 3";
    final String category4 = "Category 4";
    final String category5 = "Category 5";
    final String category6 = "Category 6";
    final String category7 = "Category 7";
    final String category8 = "Category 8";
    // create the dataset...
    final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
    dataset.addValue(15.0, series1, category1);
    dataset.addValue(24.0, series1, category2);
    dataset.addValue(31.0, series1, category3);
    dataset.addValue(25.0, series1, category4);
    dataset.addValue(56.0, series1, category5);
    dataset.addValue(37.0, series1, category6);
    dataset.addValue(77.0, series1, category7);
    dataset.addValue(18.0, series1, category8);
    return dataset;
    } public static void main(final String[] args)
    {
    final DualAxisDemo demo = new DualAxisDemo("Dual Axis Demo");
    demo.pack();
    RefineryUtilities.centerFrameOnScreen(demo);
    demo.setVisible(true);
    }
    }
      

  6.   

    到网上去找份demo的源码吧,否则够你玩的……留邮箱我可以发给你
      

  7.   

    楼上的,你的demo源码是jfree chart developer guide 的?
    是哪个版本的?给我一份看看,[email protected]
      

  8.   

    (to)donliue(donliue):
    兄台有demo的源码吗?
    可不可以也给我发一份啊
    谢谢了啊 [email protected]
    另:谢谢imA(男的不会,会的不男)兄不厌其烦对我的帮助