我用JFreeChart来表示我的x和y数组。这些数组被绘制得很好,但是回归线被破坏了,永远也不会被绘制出来。除了drawinputpoint
和drawregressionline
函数之外,所有函数都可以工作,例如打印值。不知怎的,这两个都不起作用。我不太介意drawwinginputpoint
,但我喜欢能够drawregressionline
。我的阵列具有正确的数据,因此不确定问题出在哪里。我正在createDateSetFromFile
函数中将数组数据导入数据集。我的Home\u JFrame
具有targetx
和targety
阵列。它们有arraylist
和Double
数据类型。
package gradleproject2;
import java.awt.Color;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.ui.ApplicationFrame;
import org.jfree.data.function.LineFunction2D;
import org.jfree.data.general.DatasetUtils;
import org.jfree.data.statistics.Regression;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import gradleproject2.Home_JFrame;
import org.jfree.ui.RefineryUtilities;
public class PriceEstimator extends ApplicationFrame{
private static final long serialVersionUID = 1L;
XYDataset inputData;
JFreeChart chart;
public static void main(String[] args) throws IOException {
PriceEstimator demo = new PriceEstimator();
demo.pack();
RefineryUtilities.centerFrameOnScreen(demo);
demo.setVisible(true);
demo.drawRegressionLine();
if (args.length >= 1 && args[0] != null) {
// Estimate the linear function given the input data
double regressionParameters[] = Regression.getOLSRegression(
demo.inputData, 0);
double x = Double.parseDouble(args[0]);
// Prepare a line function using the found parameters
LineFunction2D linefunction2d = new LineFunction2D(
regressionParameters[0], regressionParameters[1]);
// This is the estimated price
double y = linefunction2d.getValue(x);
demo.drawInputPoint(x, y);
}
}
public PriceEstimator() throws IOException {
super("Linear Regression");
// Read sample data from prices.txt file
inputData = createDatasetFromFile();
// Create the chart using the sample data
chart = createChart(inputData);
ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
setContentPane(chartPanel);
}
public XYDataset createDatasetFromFile() throws IOException {
ClassLoader classLoader = getClass().getClassLoader();
XYSeriesCollection dataset = new XYSeriesCollection();
XYSeries series = new XYSeries("Stock Item");
// Read the price and the date
for (int row = 0; row < Home_JFrame.targetx.size(); row++) {
series.add(Home_JFrame.targetx.get(row), Home_JFrame.targety.get(row));
}
dataset.addSeries(series);
Home_JFrame.targetx.clear();
Home_JFrame.targety.clear();
return dataset;
}
private JFreeChart createChart(XYDataset inputData) throws IOException {
// Create the chart using the data read from the prices.txt file
JFreeChart chart = ChartFactory.createScatterPlot(
"Stock Price", "Stock Date", "Stock Opening Price", inputData,
PlotOrientation.VERTICAL, true, true, false);
XYPlot plot = chart.getXYPlot();
plot.getRenderer().setSeriesPaint(0, Color.blue);
return chart;
}
private void drawRegressionLine() {
// Get the parameters 'a' and 'b' for an equation y = a + b * x,
// fitted to the inputData using ordinary least squares regression.
// a - regressionParameters[0], b - regressionParameters[1]
double regressionParameters[] = Regression.getOLSRegression(inputData,
0);
// Prepare a line function using the found parameters
LineFunction2D linefunction2d = new LineFunction2D(
regressionParameters[0], regressionParameters[1]);
// Creates a dataset by taking sample values from the line function
XYDataset dataset = DatasetUtils.sampleFunction2D(linefunction2d,
0D, 300, 100, "Fitted Regression Line");
// Draw the line dataset
XYPlot xyplot = chart.getXYPlot();
xyplot.setDataset(1, dataset);
XYLineAndShapeRenderer xylineandshaperenderer = new XYLineAndShapeRenderer(
true, false);
xylineandshaperenderer.setSeriesPaint(0, Color.YELLOW);
xyplot.setRenderer(1, xylineandshaperenderer);
}
private void drawInputPoint(double x, double y) {
// Create a new dataset with only one row
XYSeriesCollection dataset = new XYSeriesCollection();
String title = "Stock Date Distance: " + x + ", Stock Opening Price: " + y;
XYSeries series = new XYSeries(title);
series.add(x, y);
dataset.addSeries(series);
XYPlot plot = (XYPlot) chart.getPlot();
plot.setDataset(2, dataset);
XYItemRenderer renderer = new XYLineAndShapeRenderer(false, true);
plot.setRenderer(2, renderer);
}
}
通过散点图看起来你想要一条趋势线,但是除了你选择的ChartFactory
实例化的渲染器之外,你可能还会创建不必要的渲染器。要单独研究这个问题,请修改此完整示例以创建散点图,并更改现有渲染器以根据需要调整趋势线的显示。
JFreeChart chart = ChartFactory.createScatterPlot(…);
XYPlot plot = chart.getXYPlot();
XYLineAndShapeRenderer r = (XYLineAndShapeRenderer) plot.getRenderer();
r.setSeriesLinesVisible(1, Boolean.TRUE);
r.setSeriesShapesVisible(1, Boolean.FALSE);
代码:
import java.awt.Dimension;
import java.awt.EventQueue;
import java.util.Random;
import javax.swing.JFrame;
import org.jfree.chart.*;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.statistics.Regression;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
/**
* @see https://stackoverflow.com/a/37716411/230513
* @see http://stackoverflow.com/a/37716411/230513
*/
public class RegressionTest {
private static final int N = 16;
private static final Random R = new Random();
private static XYDataset createDataset() {
XYSeries series = new XYSeries("Data");
for (int i = 0; i < N; i++) {
series.add(i, R.nextGaussian() + i);
}
XYSeriesCollection xyData = new XYSeriesCollection(series);
double[] coefficients = Regression.getOLSRegression(xyData, 0);
double b = coefficients[0]; // intercept
double m = coefficients[1]; // slope
XYSeries trend = new XYSeries("Trend");
double x = series.getDataItem(0).getXValue();
trend.add(x, m * x + b);
x = series.getDataItem(series.getItemCount() - 1).getXValue();
trend.add(x, m * x + b);
xyData.addSeries(trend);
return xyData;
}
private static JFreeChart createChart(final XYDataset dataset) {
JFreeChart chart = ChartFactory.createScatterPlot("Test", "X", "Y",
dataset, PlotOrientation.VERTICAL, true, false, false);
XYPlot plot = chart.getXYPlot();
XYLineAndShapeRenderer r = (XYLineAndShapeRenderer) plot.getRenderer();
r.setSeriesLinesVisible(1, Boolean.TRUE);
r.setSeriesShapesVisible(1, Boolean.FALSE);
return chart;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
XYDataset dataset = createDataset();
JFreeChart chart = createChart(dataset);
ChartPanel chartPanel = new ChartPanel(chart) {
@Override
public Dimension getPreferredSize() {
return new Dimension(640, 480);
}
};
f.add(chartPanel);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
});
}
}
我需要绘制磁滞回线,然后计算回线内闭合的面积。我正在使用JFreeChart。 考虑以下数据: 当我尝试: 我想区别在于点的连接方式。请指导如何用jFreeChart获得所需的磁滞回线,然后如何计算封闭面积。 谢谢
我想画一些垂直线来跟踪任务,如下图中的红线所示。我相信可以使用甘特图绘制器绘制线条。 我想要的是在绘制任务期间存储直线endpoint的坐标,然后最终在绘图中绘制这些直线。 我想知道是否有一种方法可以让你在绘图上绘制任何东西,以及这是否是解决这个问题的正确方法。 以下是我的甘特图渲染器代码: 更新: 似乎LineAnnotics是实现这些行的最佳方式。Link1
有人知道如何在甘特图中的特定位置移动/绘制虚线吗?例如,我有这样的图表: 链接到图像 很难看到任务1和任务2以及任务3在哪里。 如果可能的话,画水平线不是在1,2,3线,而是在整个系列之后,以明确视觉分隔符。 谢谢
绘制线 点击菜单栏或底下快捷工具栏中的“绘制线”按钮,按照弹出对话框进行线的绘制。 使用鼠标在地图上连续点击,双击完成线的绘制后弹出属性信息对话框,可以在“说明”栏中查看并修改对于该线的说明。 在“空间信息”栏中可以看到节点的坐标信息,双击一个节点的坐标信息后可修改该节点的坐标信息,也可在三维地球上选中节点直接移动修改。 在“样式”栏修改线的
绘制线 点击菜单栏或底下快捷工具栏中的“绘制线”按钮,按照弹出对话框进行线的绘制。 使用鼠标在地图上连续点击,双击完成线的绘制后弹出属性信息对话框,可以在“说明”栏中查看并修改对于该线的说明。 在“空间信息”栏中可以看到节点的坐标信息,双击一个节点的坐标信息后可修改该节点的坐标信息,也可在三维地球上选中节点直接移动修改。 在“样式”栏修改线的
主界面,点击绘制按钮,即可进入绘制模式: 绘制模式包括:高级工具、手绘、撤销、重绘、退出绘制、线面切换、保存绘制。 添加节点:点击按钮后,以屏幕十字丝位置添加一个节点; 除添加节点按钮外,也可对地图中任意位置进行点击操作,点击后该位置也会进行添加操作: 撤销:点击后,删除上一个节点,可以连续删除; 重绘:点击后会弹