Java 使用XYSplineRenderer代替折线图

Java 使用XYSplineRenderer代替折线图,java,jfreechart,Java,Jfreechart,我正在使用createLineChart创建一个图形。这显示为任何线形图 我想应用的是xysplinerder,使线条弯曲。可能吗 这是密码。这只是一个简单的CreateLineChart,因此我想知道是否可以应用该渲染器,因为其中一个值是String,并且是一个值范围 没有现有的ChartFactory使用xysplinerder,我不确定您现有的数据集。我从这里开始,对一个正态分布进行采样,以得到原始示例。您可能需要调整精度,以适应您的数据。您可以根据需要使用中建议的任何方法更改域轴标签

我正在使用
createLineChart
创建一个图形。这显示为任何线形图

我想应用的是
xysplinerder
,使线条弯曲。可能吗

这是密码。这只是一个简单的
CreateLineChart
,因此我想知道是否可以应用该渲染器,因为其中一个值是
String
,并且是一个值范围


没有现有的
ChartFactory
使用
xysplinerder
,我不确定您现有的数据集。我从这里开始,对一个正态分布进行采样,以得到原始示例。您可能需要调整
精度
,以适应您的数据。您可以根据需要使用中建议的任何方法更改域轴标签

我的数据集使用
int字符串

仔细阅读,第一个
字符串是序列键,我将其标记为
“频率”
;第二个似乎是一个数字范围。这个新示例演示了如何使用更高的精度和
SymbolAxis
,这对于十几个范围来说应该更有效

更新示例:

导入java.awt.Dimension;
导入java.awt.EventQueue;
导入javax.swing.JFrame;
导入org.jfree.chart.ChartPanel;
导入org.jfree.chart.JFreeChart;
导入org.jfree.chart.axis.NumberAxis;
导入org.jfree.chart.axis.SymbolAxis;
导入org.jfree.chart.plot.XYPlot;
导入org.jfree.chart.renderer.xy.xysplinederer;
导入org.jfree.data.xy.XYDataset;
导入org.jfree.data.xy.XYSeries;
导入org.jfree.data.xy.XYSeriesCollection;
/**
*@见https://stackoverflow.com/a/55418498/230513
*@见https://stackoverflow.com/a/14790187/230513
*@见https://stackoverflow.com/a/40167139/230513
*/
公共级夹板试验{
公共静态最终字符串Title=“样条曲线测试”;
公共静态void main(字符串[]args){
invokeLater(新的SplineTest()::display);
}
专用void display(){
XYSeries系列=新的XYSeries(“频率”);
系列。添加(0,1);
系列。添加(1,1);
系列。添加(2,3);
系列。添加(3,7);
增加(4,11);
增加(5,21);
系列。添加(6,28);
增加(7,16);
系列。添加(8,22);
系列。添加(9,7);
系列。添加(10,1);
系列。添加(11,2);
XYDataset数据集=新的XYSeriesCollection(系列);
字符串[]标签=新字符串[series.getItemCount()];
标签[0]=“146”;
NumberAxis域=新符号轴(“X”,标签);
NumberAxis范围=新的NumberAxis(“Y”);
xysplinerder r=新的xysplinerder(8);
XYPlot XYPlot=新的XYPlot(数据集、域、范围、r);
JFreeChart图表=新的JFreeChart(xyplot);
ChartPanel ChartPanel=新的ChartPanel(图表){
@凌驾
公共维度getPreferredSize(){
返回新维度(640480);
}
};
JFrame=新JFrame(标题);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(图表面板);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
}

我已经添加了代码,它生成的是一个带有峰值的图形,我想给它一些曲线,看看是否有什么对我有帮助。我将尝试看看什么是有效的。在我的数据集中使用int字符串。
public class Intento1 extends JFrame {

    JFreeChart Grafica;
    JFreeChart Grafica2;
    JFreeChart Grafica3;
    DefaultCategoryDataset Datos = new DefaultCategoryDataset();
    DefaultCategoryDataset Datos2 = new DefaultCategoryDataset();
    //XYDataset Datos2 = new XYDataset();

    //XYSplineRenderer render = new XYSplineRenderer();

    private JPanel contentPane;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Intento1 frame = new Intento1();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Intento1() {

        Datos.addValue(1, "Frecuencia", "Menos de 46");
        Datos.addValue(1, "Frecuencia", "46-55");
        Datos.addValue(3, "Frecuencia", "56-65");
        Datos.addValue(7, "Frecuencia", "66-75");
        Datos.addValue(11, "Frecuencia", "76-85");
        Datos.addValue(21, "Frecuencia", "86-95");
        Datos.addValue(28, "Frecuencia", "96-105");
        Datos.addValue(16, "Frecuencia", "106-115");
        Datos.addValue(22, "Frecuencia", "116-125");
        Datos.addValue(7, "Frecuencia", "126-135");
        Datos.addValue(1, "Frecuencia", "136-145");
        Datos.addValue(2, "Frecuencia", "146 o Mas");

        Datos2.addValue(0.008, "Frecuencia Relativa", "Menos de 46");
        Datos2.addValue(0.008, "Frecuencia Relativa", "46-55");
        Datos2.addValue(0.025, "Frecuencia Relativa", "56-65");
        Datos2.addValue(0.058, "Frecuencia Relativa", "66-75");
        Datos2.addValue(0.092, "Frecuencia Relativa", "76-85");
        Datos2.addValue(0.175, "Frecuencia Relativa", "86-95");
        Datos2.addValue(0.234, "Frecuencia Relativa", "96-105");
        Datos2.addValue(0.134, "Frecuencia Relativa", "106-115");
        Datos2.addValue(0.183, "Frecuencia Relativa", "116-125");
        Datos2.addValue(0.058, "Frecuencia Relativa", "126-135");
        Datos2.addValue(0.008, "Frecuencia Relativa", "136-145");
        Datos2.addValue(0.017, "Frecuencia Relativa", "146 o Mas");
        //Grafica.getXYPlot().setRenderer(render);

        Grafica = ChartFactory.createLineChart("Variable continua"
                    , "Produccion", "Frecuencia", Datos, PlotOrientation.VERTICAL,
                    true,true,false);
        Grafica2 = ChartFactory.createLineChart("Variable continua"
                , "Produccion", "Frecuencia", Datos2, PlotOrientation.VERTICAL,
                true,true,false);
        Grafica3=ChartFactory.createLineChart ("Variablew", "Produccion", "Frecuencia", Datos2, PlotOrientation.VERTICAL,
                true, true, false);

        CategoryPlot plot = Grafica.getCategoryPlot();
        //XYPlot awa =  Grafica.getPlot();

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JButton btnGraficar = new JButton("Graficar");
        btnGraficar.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {


                ChartPanel Panel = new ChartPanel(Grafica);
                    JFrame Ventana = new JFrame("JFreeChart");
                    Ventana.getContentPane().add(Panel);
                    Ventana.pack();
                    Ventana.setVisible(true);
                    Ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            }
        });
        btnGraficar.setBounds(160, 36, 89, 23);
        contentPane.add(btnGraficar);

        JButton btnGraficarRelativas = new JButton("Graficar Relativas");
        btnGraficarRelativas.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                ChartPanel Panel = new ChartPanel(Grafica2);
                JFrame Ventana = new JFrame("JFreeChart");
                Ventana.getContentPane().add(Panel);
                Ventana.pack();
                Ventana.setVisible(true);
                Ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            }
        });
        btnGraficarRelativas.setBounds(160, 95, 89, 23);
        contentPane.add(btnGraficarRelativas);
    }
}
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.SymbolAxis;
import org.jfree.chart.plot.XYPlot;
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;

/**
 * @see https://stackoverflow.com/a/55418498/230513
 * @see https://stackoverflow.com/a/14790187/230513
 * @see https://stackoverflow.com/a/40167139/230513
 */
public class SplineTest {

    public static final String Title = "Spline Test";

    public static void main(String[] args) {
        EventQueue.invokeLater(new SplineTest()::display);
    }

    private void display() {
        XYSeries series = new XYSeries("Frequency");
        series.add(0, 1);
        series.add(1, 1);
        series.add(2, 3);
        series.add(3, 7);
        series.add(4, 11);
        series.add(5, 21);
        series.add(6, 28);
        series.add(7, 16);
        series.add(8, 22);
        series.add(9, 7);
        series.add(10, 1);
        series.add(11, 2);
        XYDataset dataset = new XYSeriesCollection(series);
        String[] labels = new String[series.getItemCount()];
        labels[0] = "<46";
        labels[1] = "46-55";
        labels[2] = "56-65";
        labels[3] = "66-75";
        labels[4] = "76-85";
        labels[5] = "86-95";
        labels[6] = "96-105";
        labels[7] = "106-115";
        labels[8] = "116-125";
        labels[9] = "126-135";
        labels[10] = "136-145";
        labels[11] = ">146";
        NumberAxis domain = new SymbolAxis("X", labels);
        NumberAxis range = new NumberAxis("Y");
        XYSplineRenderer r = new XYSplineRenderer(8);
        XYPlot xyplot = new XYPlot(dataset, domain, range, r);
        JFreeChart chart = new JFreeChart(xyplot);
        ChartPanel chartPanel = new ChartPanel(chart) {

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(640, 480);
            }
        };
        JFrame frame = new JFrame(Title);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(chartPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}