From 604cbe64f05a1fa5a843dd6a940218eaee870b66 Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Thu, 16 Jan 2025 15:40:45 +0100 Subject: [PATCH] kombinierter Plot --- .../tub/vsp/bvwp/users/kmt/FiguresKMT.java | 120 ++++++++++++++++++ .../kmt/RunLocalCsvScrapingKMT2_hEART.java | 14 +- 2 files changed, 131 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/tub/vsp/bvwp/users/kmt/FiguresKMT.java b/src/main/java/org/tub/vsp/bvwp/users/kmt/FiguresKMT.java index 7920a0e..dc9aa0f 100644 --- a/src/main/java/org/tub/vsp/bvwp/users/kmt/FiguresKMT.java +++ b/src/main/java/org/tub/vsp/bvwp/users/kmt/FiguresKMT.java @@ -4,6 +4,7 @@ import org.tub.vsp.bvwp.data.Headers; import org.tub.vsp.bvwp.data.HeadersKN; import org.tub.vsp.bvwp.data.type.Einstufung; +import tech.tablesaw.api.DoubleColumn; import tech.tablesaw.api.Table; import tech.tablesaw.plotly.components.Axis; import tech.tablesaw.plotly.components.Axis.Type; @@ -14,6 +15,9 @@ import tech.tablesaw.plotly.traces.ScatterTrace.Mode; import tech.tablesaw.plotly.traces.Trace; +import java.util.ArrayList; +import java.util.List; + class FiguresKMT { private static final String legendFormat = "%30s"; @@ -346,4 +350,120 @@ static Figure createFigureNkvChange(Table table, String yName, String yName2) { layout, cbrOverCbrTrace1, cbrOverCbrTrace2, diagonale, horizontalCbr1, verticalCbr1); } + /** + * Für NKV vergleich-Plot mit 2 Y-Achsen. + * */ + static Figure createFigureElaChange(Table table, String xName, String yName1, String yName2, String yName3, String yAxisName) { + + // String xName = Headers.NKV_NO_CHANGE; + // String yName = Headers.NKV_CO2; + //Todo: Berechnen + double maxX = table.numberColumn( xName ).max() * 1.1; + double maxY = calculateMaxValue(table, List.of(yName1, yName2, yName3)) * 1.1; + +// double maxX = 20.; +// double maxY = 20.; + + Axis xAxis = + Axis.builder() + .type(Type.LINEAR) + .title(xName) + .range(0., maxX) + // .autoRange( Axis.AutoRange.REVERSED ); + .build(); + + table = table.sortDescendingOn(HeadersKN.NKV_ORIG); + + Axis yAxis = + Axis.builder() + .type(Type.LINEAR) + .range(Double.min(0., 1.1 * table.numberColumn(yName1).min()), maxY) + // .range( 1.1*table.numberColumn( y2Name ).min(),4. ) + .title(yName1) + .build(); + + Axis yAxis2 = + Axis.builder() + .type(Type.LINEAR) + .range(Double.min(0., 1.1 * table.numberColumn(yName2).min()), maxY) + // .range( 1.1*table.numberColumn( y2Name ).min(),4. ) + .title(yAxisName) + .build(); + + + Layout layout = + Layout.builder( "Changes from calculation approaches over " + xName) + .xAxis(xAxis) + .yAxis(yAxis) + .yAxis2(yAxis2) + .width(RunLocalCsvScrapingKMT_EWGT.plotWidth) + .build(); + + Trace y1overX = + ScatterTrace.builder(table.numberColumn(xName), table.numberColumn(yName1)) + .text(table.stringColumn(Headers.PROJECT_NAME).asObjectArray()) + .name(yName1) + .marker(Marker.builder().color("blue").build()) + .build(); + + Trace y2overX = + ScatterTrace.builder(table.numberColumn(xName), table.numberColumn(yName2)) + .text(table.stringColumn(Headers.PROJECT_NAME).asObjectArray()) + .name(yName2) + .marker(Marker.builder().color("red").build()) + .build(); + + Trace y3overX = + ScatterTrace.builder(table.numberColumn(xName), table.numberColumn(yName3)) + .text(table.stringColumn(Headers.PROJECT_NAME).asObjectArray()) + .name(yName3) + .marker(Marker.builder().color("orange").build()) + .build(); + + //Diagonalen + double overallMax = Math.max(maxX, maxY); + double[] xx = new double[] {0.,overallMax}; + double[] yy = new double[] {0., overallMax}; + double[] xy1 = new double[] {1., 1.}; + + Trace diagonale = + ScatterTrace.builder(xx, yy) + .name("diagonal Line") + .mode(Mode.LINE) + .marker(Marker.builder().color("magenta").build()) + .build(); + + return new Figure(layout, y1overX, y2overX, y3overX, diagonale); + +// Trace horizontalCbr1 = +// ScatterTrace.builder(xx, xy1) +// .name(yAxisName + " = 1") +// .mode(Mode.LINE) +// .marker(Marker.builder().color("gray").build()) +// .build(); +// +// Trace verticalCbr1 = +// ScatterTrace.builder(xy1, yy) +// .name(xName+ " = 1") +// .mode(Mode.LINE) +// .marker(Marker.builder().color("gray").build()) +// .build(); +// +// return new Figure(layout, y1overX, y2overX, y3overX, diagonale, horizontalCbr1, verticalCbr1); + } + + private static double calculateMaxValue(Table table, List yNames) { + List allValues = new ArrayList<>(); + + for (String yName : yNames) { + DoubleColumn column = table.doubleColumn(yName); + for (double value : column) { + if (!Double.isNaN(value)) { + allValues.add(value); + } + } + } + return allValues.stream().max(Double::compare).orElse(Double.NaN); + } + } diff --git a/src/main/java/org/tub/vsp/bvwp/users/kmt/RunLocalCsvScrapingKMT2_hEART.java b/src/main/java/org/tub/vsp/bvwp/users/kmt/RunLocalCsvScrapingKMT2_hEART.java index e66eb4f..3a46c7f 100644 --- a/src/main/java/org/tub/vsp/bvwp/users/kmt/RunLocalCsvScrapingKMT2_hEART.java +++ b/src/main/java/org/tub/vsp/bvwp/users/kmt/RunLocalCsvScrapingKMT2_hEART.java @@ -13,7 +13,6 @@ import org.apache.logging.log4j.Logger; import org.tub.vsp.bvwp.BvwpUtils; import org.tub.vsp.bvwp.Gbl; -import org.tub.vsp.bvwp.data.Headers; import org.tub.vsp.bvwp.data.HeadersKN; import org.tub.vsp.bvwp.data.container.analysis.StreetAnalysisDataContainer; import org.tub.vsp.bvwp.data.type.Einstufung; @@ -113,13 +112,13 @@ private static void plotKMTforHeartFigures(Table table) throws IOException { Figures2KN figures2 = new Figures2KN(table); List>> figures = new ArrayList<>(); + Figure fig; figures.add( Pair.create( Figures2KN.createHeader1( "Plots für hEART-Paper 2025" ), null ) ); + //##### figures.add( Pair.create( Figures2KN.createHeader1( "Aus Elastizitäten" ), null ) ); - Figure fig; - fig = figures2.fzkmEl_vs_fzkm(ADDTL_PKWKM_ORIG, ADDTL_PKWKM_EL06 ); figures.add( Pair.create( Figures2KN.createHeader2( "Elastizität 0.6"), Collections.singletonList( fig ))); @@ -130,6 +129,7 @@ private static void plotKMTforHeartFigures(Table table) throws IOException { figures.add( Pair.create( Figures2KN.createHeader2( "'reduziert': Elastizität 0.3 oder 0.6 ja nach Bautyp; halbiert"), Collections.singletonList( fig ))); + //#### figures.add( Pair.create( Figures2KN.createHeader1( "Aus Reisezeitgewinnen" ), null ) ); fig = figures2.fzkmEl_vs_fzkm(ADDTL_PKWKM_ORIG, ADDTL_PKWKM_FROM_TTIME_29_HALF); @@ -138,6 +138,14 @@ private static void plotKMTforHeartFigures(Table table) throws IOException { fig = figures2.fzkmEl_vs_fzkm(ADDTL_PKWKM_ORIG, ADDTL_PKWKM_FROM_TTIME_29_HALF_InklBVWP); figures.add( Pair.create( Figures2KN.createHeader2( "BVWP plus 0.5 Fahreitgewinnen, 29km/h, "), Collections.singletonList( fig ))); + + //#### + figures.add( Pair.create( Figures2KN.createHeader1( "Kombiniert" ), null ) ); + + fig = FiguresKMT.createFigureElaChange(table, ADDTL_PKWKM_ORIG, ADDTL_PKWKM_EL06, ADDTL_PKWKM_EL0306_HALF, ADDTL_PKWKM_FROM_TTIME_29_HALF_InklBVWP, "additional mio vkm/a"); + figures.add( Pair.create( Figures2KN.createHeader2( "Kombiniert die verschiedenen Ansätze"), Collections.singletonList( fig ))); + + plotFigures("multiplot_hEART.html", figures);