首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用JFreeChart设置两个系列的不同y轴

用JFreeChart设置两个系列的不同y轴
EN

Stack Overflow用户
提问于 2015-04-07 14:46:22
回答 2查看 9.5K关注 0票数 7

我使用JFreeChart绘制两个系列数据(XYSeries)。复杂的因素是,其中一个数据序列的y值通常比我的第二个数据序列的y值高得多(假设第一个系列的y值为数百万,而第二个系列的y值为数百个数量级)。在我的第一个数据集中的高值的存在导致图的范围是这样的,我的第二个数据集的y值是不可理解的。

在图中添加第二个y轴,这样我的两个数据序列都使用自己的y轴,就可以解决这个问题。有人知道如何用JFreeChart来做这件事吗?

当前完整性代码:

代码语言:javascript
运行
复制
XYSeriesCollection dataset = new XYSeriesCollection();
XYSeries series1 = new XYSeries("series1");
XYSeries series2 = new XYSeries("series2");

// Here is my code to fill series1 and series2 with data    

dataset.addSeries(series1);
dataset.addSeries(series2);

JFreeChart chart = ChartFactory.createXYLineChart(
    "title", "x-axis title", "y-axis title", dataset, PlotOrientation.VERTICAL, true, true, false
);
chart.getXYPlot().setRenderer(new XYSplineRenderer());
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-07 16:01:39

您可以手动创建JFreeChart对象,而不是使用ChartFactory。首先生成数据集和绘图,将每个数据集设置为索引。然后,您可以使用必要的Axis和Renderer自定义绘图。下面是一个使用虚拟数据的示例,该数据集有两个数据集,每个数据集具有不同的y值:

代码语言:javascript
运行
复制
    //create the series - add some dummy data
    XYSeries series1 = new XYSeries("series1");
    XYSeries series2 = new XYSeries("series2");
    series1.add(1000, 1000);
    series1.add(1150, 1150);
    series1.add(1250, 1250);

    series2.add(1000, 111250);
    series2.add(1150, 211250);
    series2.add(1250, 311250);

    //create the datasets
    XYSeriesCollection dataset1 = new XYSeriesCollection();
    XYSeriesCollection dataset2 = new XYSeriesCollection();
    dataset1.addSeries(series1);
    dataset2.addSeries(series2);

    //construct the plot
    XYPlot plot = new XYPlot();
    plot.setDataset(0, dataset1);
    plot.setDataset(1, dataset2);

    //customize the plot with renderers and axis
    plot.setRenderer(0, new XYSplineRenderer());//use default fill paint for first series
    XYSplineRenderer splinerenderer = new XYSplineRenderer();
    splinerenderer.setSeriesFillPaint(0, Color.BLUE);
    plot.setRenderer(1, splinerenderer);
    plot.setRangeAxis(0, new NumberAxis("Series 1"));
    plot.setRangeAxis(1, new NumberAxis("Series 2"));
    plot.setDomainAxis(new NumberAxis("X Axis"));

    //Map the data to the appropriate axis
    plot.mapDatasetToRangeAxis(0, 0);
    plot.mapDatasetToRangeAxis(1, 1);   

    //generate the chart
    JFreeChart chart = new JFreeChart("MyPlot", getFont(), plot, true);
    chart.setBackgroundPaint(Color.WHITE);
    JPanel chartPanel = new ChartPanel(chart);
票数 14
EN

Stack Overflow用户

发布于 2019-01-29 23:49:43

我已经调整了上面的解决方案,以配合最新版本的JFreeChart (2019年1月29日)。

如果正确导入JFreeChart库,这将正确运行。我在导入中设置了一个pom.xml,如下所示

代码语言:javascript
运行
复制
 <dependency>
        <groupId>org.jfree</groupId>
        <artifactId>jfreechart</artifactId>
        <version>1.0.19</version>
 </dependency>

下面是完整的代码片段:

代码语言:javascript
运行
复制
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYSplineRenderer;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

import javax.swing.*;
import java.awt.*;

class GraphTest2 {
    // driver that actually runs the thing
    public static void main(String[] args) {
        SwingUtilities.invokeLater( () -> {
            LineChartEx ex = new LineChartEx();
            ex.setVisible(true);
        });
    }
}

class LineChartEx extends JFrame {
    public LineChartEx() {
        initUI();
    }

    private void initUI() {
        //create the series - add some dummy data
        XYSeries series1 = new XYSeries("series1");
        XYSeries series2 = new XYSeries("series2");
        series1.add(1000, 1000);
        series1.add(1150, 1150);
        series1.add(1250, 1250);

        series2.add(1000, 111250);
        series2.add(1150, 211250);
        series2.add(1250, 311250);

        //create the datasets
        XYSeriesCollection dataset1 = new XYSeriesCollection();
        XYSeriesCollection dataset2 = new XYSeriesCollection();
        dataset1.addSeries(series1);
        dataset2.addSeries(series2);

        //construct the plot
        XYPlot plot = new XYPlot();
        plot.setDataset(0, dataset1);
        plot.setDataset(1, dataset2);

        //customize the plot with renderers and axis
        plot.setRenderer(0, new XYSplineRenderer());//use default fill paint for first series
        XYSplineRenderer splinerenderer = new XYSplineRenderer();
        splinerenderer.setSeriesFillPaint(0, Color.BLUE);
        plot.setRenderer(1, splinerenderer);
        plot.setRangeAxis(0, new NumberAxis("Series 1"));
        plot.setRangeAxis(1, new NumberAxis("Series 2"));
        plot.setDomainAxis(new NumberAxis("X Axis"));

        //Map the data to the appropriate axis
        plot.mapDatasetToRangeAxis(0, 0);
        plot.mapDatasetToRangeAxis(1, 1);

        //generate the chart
        JFreeChart chart = new JFreeChart("MyPlot", getFont(), plot, true);
        chart.setBackgroundPaint(Color.WHITE);
        //JPanel jpanel = new ChartPanel(chart);


        // NEW PART THAT MAKES IT WORK
        ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));
        chartPanel.setBackground(Color.white);
        add(chartPanel);

        pack();
        setTitle("Line chart");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29494440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档