首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >LineChart FX -删除实线

LineChart FX -删除实线
EN

Stack Overflow用户
提问于 2017-02-24 03:09:05
回答 3查看 905关注 0票数 2

我有一个关于图形LineChart JavaFX的奇怪的问题。

我有这个图表:

在X轴上形成“跳跃”的点(如我所得的两个红色点所示),因此JavaFX在这两个点之间画了一条线。如何删除每个“跳转”之间行?

我发布了以下代码:

代码语言:javascript
复制
public class ControllerIndividua {

    public static void plotIndividuaFull(String path, Stage stage, String name) {
        final NumberAxis xAxisIntensity = new NumberAxis(); //Dichiarazione asseX
        final NumberAxis yAxisIntensity = new NumberAxis();//Dichiarazione asseY

        DetectionS1.countS1();

        //Dichiarazione del tipo di grafico
        final LineChart<Number, Number> lineChartIntensity = new LineChart<Number, Number>(xAxisIntensity,yAxisIntensity);

        ArrayList<Double> extractedData; //Lista dei valori dello dell' intensità
        ArrayList<Double> extractedTime; //Lista del tempo
        ArrayList<Double> extractedS1; //Lista del tempo
        ArrayList<Double> extractedS1Time; //Lista del tempo

        //Gestione e settaggio del grafico
        lineChartIntensity.getData().clear();

        try {
            //Popolamento delle liste
            extractedTime = IntensityExtractor.pointsTime();
            extractedData = IntensityExtractor.pointsIntensity();
            extractedS1 = DetectionS1.S1pitch();
            extractedS1Time = DetectionS1.pointsS1Time();
            XYChart.Series<Number, Number> series = new XYChart.Series<Number, Number>();
            XYChart.Series<Number, Number> seriesS1 = new XYChart.Series<Number, Number>(); //Creazione seconda serie
            series.setName("Intensità di:\t" + name.toUpperCase());

            for (int j = 0; j < extractedS1.size(); j++) {
                seriesS1.getData().add(new XYChart.Data<Number, Number>(extractedS1Time.get(j), extractedS1.get(j)));
                lineChartIntensity.getStyleClass().add("CSSintensity");
            }

            //Creazione finestra e stampa del grafico
            Scene scene = new Scene(lineChartIntensity, 1000, 600);
            lineChartIntensity.getData().addAll(series,seriesS1);
            scene.getStylesheets().add("application/application.css");
            stage.setScene(scene);
            stage.show();
        } catch (java.lang.Exception e) {
            e.printStackTrace();
        }
    }
}

有人也知道我该怎么做吗?

提前感谢大家。

EN

回答 3

Stack Overflow用户

发布于 2019-01-03 18:10:19

我做了一个GapLineChart,每当它看到一个Double.NaN时,它就会自动设置一个MoveTo,就像它所指的那样。你可以在这里找到https://gist.github.com/sirolf2009/ae8a7897b57dcf902b4ed747b05641f9。查看第一条注释中的示例

票数 4
EN

Stack Overflow用户

发布于 2017-02-27 00:54:47

我检查过了。不能只更改此行的一部分。因为这是一个很长的路径,你不能改变路径的一个元素。

我认为唯一的方法是在不同的系列中添加每个“跳转”。

票数 1
EN

Stack Overflow用户

发布于 2019-11-21 17:30:21

我需要调整LineChart,以便它绘制线段,因此每一对数据点都创建了一个线段。通过扩展LineChart和覆盖layoutPlotChildren函数非常简单,虽然我不得不删除一个动画y-scaling变量,因为它在超类中是private,但我没有对图形进行动画处理,所以它没有问题。无论如何,这里是Kotlin版本(您可以很容易地适应Java,或者只复制Java LineChart layoutPlotChildren代码并进行改编)。这很容易适应您的环境,只需在最后更改for循环的内容即可。

代码语言:javascript
复制
import javafx.scene.chart.Axis
import javafx.scene.chart.LineChart
import javafx.scene.shape.LineTo
import javafx.scene.shape.MoveTo
import javafx.scene.shape.Path
import java.util.*
import kotlin.collections.ArrayList

class GapLineChart<X, Y>(xAxis: Axis<X>?, yAxis: Axis<Y>?) : LineChart<X, Y>(xAxis, yAxis) {

    public override fun layoutPlotChildren() {

        val constructedPath = ArrayList<LineTo>(data.size)

        for (seriesIndex in 0 until data.size) {

            val series = data[seriesIndex]

            if (series.node is Path) {

                val seriesLine = (series.node as Path).elements
                val it = getDisplayedDataIterator(series)

                seriesLine.clear()
                constructedPath.clear()

                var parity = true

                while (it.hasNext()) {

                    val item = it.next()
                    val x = xAxis.getDisplayPosition(item.xValue)
                    val y = yAxis.getDisplayPosition(yAxis.toRealValue(yAxis.toNumericValue(item.yValue)))

                    if (java.lang.Double.isNaN(x) || java.lang.Double.isNaN(y)) {
                        continue
                    }

                    if(parity)
                        constructedPath.add(LineTo(x, y))

                    val symbol = item.node

                    if (symbol != null) {

                        val w = symbol.prefWidth(-1.0)
                        val h = symbol.prefHeight(-1.0)

                        symbol.resizeRelocate(x - w / 2, y - h / 2, w, h)
                    }
                }
                when (axisSortingPolicy) {

                    SortingPolicy.X_AXIS -> constructedPath.sortWith(Comparator { e1, e2 -> java.lang.Double.compare(e1.x, e2.x) })
                    SortingPolicy.Y_AXIS -> constructedPath.sortWith(Comparator { e1, e2 -> java.lang.Double.compare(e1.y, e2.y) })
                }

                if (!constructedPath.isEmpty()) {

                    for (i in 0 until constructedPath.size-1 step 2) {

                        seriesLine.add(MoveTo(constructedPath[i].x, constructedPath[i].y))
                        seriesLine.add(LineTo(constructedPath[i+1].x, constructedPath[i+1].y))
                    }
                }
            }
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42424166

复制
相关文章

相似问题

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