【问题标题】:JFreeChart-FX time series vertical tick labels overlapJFreeChart-FX 时间序列垂直刻度标签重叠
【发布时间】:2021-11-22 03:45:26
【问题描述】:

当使用 渲染带有垂直刻度标签的时间序列图表时,标签意外地与域轴重叠,并且有时会在调整大小时发生变化。我无法用 Swing 或纯 Java2D 重现这一点,如 here 所示。我欢迎任何指导。

import java.awt.BasicStroke;
import java.awt.Color;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.fx.ChartViewer;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYSplineRenderer;
import org.jfree.data.time.Day;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;

/**
 * @see https://stackoverflow.com/q/70021577/230513
 */
public class SplineTest extends Application {

    @Override
    public void start(Stage stage) throws ParseException {
        SimpleDateFormat inFormat = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat outFormat = new SimpleDateFormat("dd-MM-yyyy");
        // data
        double[] values = new double[]{0.67, 0.67, 0.69, 0.70, 0.70, 0.71, 0.71};
        String[] dates = new String[]{"2021-11-09", "2021-11-10", "2021-11-11",
            "2021-11-12", "2021-11-15", "2021-11-16", "2021-11-17"};
        TimeSeries series = new TimeSeries("Time Series");
        for (int i = 0; i < values.length; i++) {
            Date date = inFormat.parse(dates[i]);
            series.add(new Day(date), values[i]);
        }
        TimeSeriesCollection dataset = new TimeSeriesCollection(series);
        // axes
        NumberAxis rangeAxis = new NumberAxis("Value");
        NumberFormat numberFormat = NumberFormat.getInstance();
        numberFormat.setMinimumFractionDigits(2);
        numberFormat.setMaximumFractionDigits(2);
        rangeAxis.setNumberFormatOverride(numberFormat);
        rangeAxis.setLowerMargin(0.08); // 8% lower margin
        rangeAxis.setAutoRangeIncludesZero(false);
        DateAxis domainAxis = new DateAxis("Date");
        domainAxis.setDateFormatOverride(outFormat);
        domainAxis.setVerticalTickLabels(true);
        // renderer, plot, chart
        XYSplineRenderer r = new XYSplineRenderer(15);
        XYPlot xyplot = new XYPlot(dataset, domainAxis, rangeAxis, r);
        JFreeChart chart = new JFreeChart(null, xyplot);
        r.setSeriesPaint(0, new Color(255, 152, 0));
        r.setSeriesStroke(0, new BasicStroke(2.0f));
        // display
        Scene scene = new Scene(new ChartViewer(chart));
        stage.setTitle("SplineTest");
        stage.setScene(scene);
        stage.setWidth(600);
        stage.setHeight(400);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

【问题讨论】:

    标签: jfreechart-fx java javafx jfreechart-fx


    【解决方案1】:

    引用的示例使用不存在ChartFactory 的渲染器。这些工厂说明了典型的用例;通过将ChartTheme 应用到chart 来结束。下面的变体应用了StandardChartTheme,它为影响几何的元素建立了一致的默认值,例如字体度量和轴偏移;如图所示,可以自定义默认值。

    initial thread 上运行的纯Java2D 中不会出现此问题。类似的 Swing 程序通常安排在 EventQueue 上。 程序依赖于自定义 GraphicsContext;应用 ChartTheme 可确保在第一次更新时出现所需的默认值。

    import java.awt.BasicStroke;
    import java.awt.Color;
    import java.text.NumberFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.stage.Stage;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.StandardChartTheme;
    import org.jfree.chart.axis.DateAxis;
    import org.jfree.chart.axis.NumberAxis;
    import org.jfree.chart.fx.ChartViewer;
    import org.jfree.chart.plot.XYPlot;
    import org.jfree.chart.renderer.xy.XYSplineRenderer;
    import org.jfree.data.time.Day;
    import org.jfree.data.time.TimeSeries;
    import org.jfree.data.time.TimeSeriesCollection;
    
    /**
     * @see https://stackoverflow.com/a/70058016/230513
     * @see https://stackoverflow.com/q/70021577/230513
     */
    public class SplineTest extends Application {
    
        @Override
        public void start(Stage stage) throws ParseException {
            SimpleDateFormat inFormat = new SimpleDateFormat("yyyy-MM-dd");
            SimpleDateFormat outFormat = new SimpleDateFormat("dd-MM-yyyy");
            // data
            double[] values = new double[]{0.67, 0.67, 0.69, 0.70, 0.70, 0.71, 0.71};
            String[] dates = new String[]{"2021-11-09", "2021-11-10", "2021-11-11",
                "2021-11-12", "2021-11-15", "2021-11-16", "2021-11-17"};
            TimeSeries series = new TimeSeries("Time Series");
            for (int i = 0; i < values.length; i++) {
                Date date = inFormat.parse(dates[i]);
                series.add(new Day(date), values[i]);
            }
            TimeSeriesCollection dataset = new TimeSeriesCollection(series);
            // axes
            NumberAxis rangeAxis = new NumberAxis("Value");
            NumberFormat numberFormat = NumberFormat.getInstance();
            numberFormat.setMinimumFractionDigits(2);
            numberFormat.setMaximumFractionDigits(2);
            rangeAxis.setNumberFormatOverride(numberFormat);
            rangeAxis.setLowerMargin(0.08); // 8% lower margin
            rangeAxis.setAutoRangeIncludesZero(false);
            DateAxis domainAxis = new DateAxis("Date");
            domainAxis.setDateFormatOverride(outFormat);
            domainAxis.setVerticalTickLabels(true);
            // renderer, plot, chart
            XYSplineRenderer r = new XYSplineRenderer(15);
            XYPlot xyplot = new XYPlot(dataset, domainAxis, rangeAxis, r);
            JFreeChart chart = new JFreeChart(null, xyplot);
            StandardChartTheme theme = new StandardChartTheme("Custom");
            theme.setPlotBackgroundPaint(Color.WHITE);
            theme.setDomainGridlinePaint(Color.LIGHT_GRAY);
            theme.setRangeGridlinePaint(Color.LIGHT_GRAY);
            theme.apply(chart);
            r.setSeriesPaint(0, new Color(255, 152, 0));
            r.setSeriesStroke(0, new BasicStroke(2.0f));
            // display
            Scene scene = new Scene(new ChartViewer(chart));
            stage.setTitle("SplineTest");
            stage.setScene(scene);
            stage.setWidth(600);
            stage.setHeight(400);
            stage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-13
      • 2019-05-11
      • 1970-01-01
      • 2013-07-21
      • 2013-10-31
      • 1970-01-01
      • 2013-10-17
      • 2017-09-20
      • 2016-10-27
      相关资源
      最近更新 更多