【问题标题】:JFreeChart StackedXYAreaRenderer causes "crimp" in chartJFreeChart StackedXYAreaRenderer 导致图表中出现“卷曲”
【发布时间】:2016-11-08 19:51:41
【问题描述】:

我正在使用 JFreeChart 显示两组数据随时间变化的堆积折线图,在本例中为 dogscats

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StackedXYAreaRenderer;
import org.jfree.data.time.Minute;
import org.jfree.data.time.TimeTableXYDataset;

public class ChartTest {

    public ChartTest() throws ParseException{

        TimeTableXYDataset chartData = createChartData();
        JFreeChart chart = createChart(chartData);
        ChartPanel chartPanel = new ChartPanel(chart);  

        JFrame frame = new JFrame("Chart Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(chartPanel);
        frame.setSize(500,  500);

        frame.setVisible(true);
    }

    private TimeTableXYDataset createChartData() throws ParseException {

        int[] dogs = {14, 81, 99, 89, 151, 263, 396, 548, 822, 1410, 2180, 3134, 4065, 5016, 6019, 7648, 9323, 11059, 12252, 13432, 15238, 17559, 19796, 21853, 23971, 26414, 28694, 31371, 34233, 37353, 40451, 44081, 47978, 52040, 56024, 60486, 64881, 69663, 74320, 79391, 84840, 91228, 96383, 102061, 107832, 114244, 119992, 126207, 132894, 139146, 144727, 150896, 156503, 161960, 167724, 174172, 180121, 185929, 191375, 196050, 200768, 205208, 208727, 212329, 216439, 221102, 224284, 226944, 230307, 233075, 234814, 236220, 237733, 239158, 240311, 241267};
        int[] cats = {244, 360, 363, 644, 1075, 1516, 2241, 3160, 3591, 4661, 5633, 6990, 7889, 9059, 10510, 11743, 12506, 13540, 14557, 15705, 16969, 18350, 20197, 21659, 23160, 24840, 26394, 28109, 29742, 31428, 33021, 34514, 35822, 37339, 38784, 40258, 41568, 42921, 44180, 45454, 46710, 48084, 49418, 50712, 51920, 53014, 53923, 54830, 55756, 56573, 57554, 58352, 59064, 59874, 60933, 61948, 62762, 63299, 63772, 64243, 64789, 65206, 65693, 66016, 66391, 66859, 67432, 67919, 68400, 68677, 68944, 69211, 69511, 69786, 69990, 70279};

        final TimeTableXYDataset chartData = new TimeTableXYDataset();

        long start = new SimpleDateFormat("MM/dd/yyyy HH:mm").parse("11/08/2016 08:00").getTime();

        for (int t = 0; t < dogs.length; t++) {
            Minute m = new Minute(new Date(start + 15*t*60*1000));
            chartData.add(m, dogs[t], "Dogs");
            chartData.add(m, cats[t], "Cats");
        }

        return chartData;
    }

    private JFreeChart createChart(TimeTableXYDataset chartData) {

        JFreeChart chart = ChartFactory.createStackedXYAreaChart("Dogs and Cats", "Time", "Count", chartData, PlotOrientation.VERTICAL, false, true, false);

        StackedXYAreaRenderer chartRenderer = new StackedXYAreaRenderer(); 
        XYPlot plot = (XYPlot)chart.getPlot();
        plot.setRenderer(chartRenderer);

        DateAxis dateAxis = new DateAxis();
        dateAxis.setDateFormatOverride(new SimpleDateFormat("HH:mm"));
        dateAxis.setTickLabelFont(dateAxis.getTickLabelFont().deriveFont(20f));

        plot.setDomainAxis(dateAxis);

        return chart;
    }

    public static void main(String... args) throws ParseException{
        new ChartTest();
    }
}

但是,这会导致图表的猫部分出现“卷曲”:

我查看了我的数据,它不包含负值或任何可能使图表出错的奇怪内容。

通过一些shotgun调试,我意识到如果我从createChart()函数中删除这部分代码:

    StackedXYAreaRenderer chartRenderer = new StackedXYAreaRenderer(); 
    XYPlot plot = (XYPlot)chart.getPlot();
    plot.setRenderer(chartRenderer);

    DateAxis dateAxis = new DateAxis();
    dateAxis.setDateFormatOverride(new SimpleDateFormat("HH:mm"));
    dateAxis.setTickLabelFont(dateAxis.getTickLabelFont().deriveFont(20f));

    plot.setDomainAxis(dateAxis);

然后我得到一个更合理的堆积折线图:

但后来我丢失了格式正确的日期。

我的问题是:

  • 是什么导致图表中猫部分的“卷曲”以及两个堆栈之间的空间?

  • 是否有其他方法来格式化不会导致此行为的日期?

【问题讨论】:

    标签: java swing jfreechart


    【解决方案1】:

    ChartFactory.createStackedXYAreaChart() 实例化StackedXYAreaRenderer2 来避免这个问题。您的示例将其替换为 StackedXYAreaRenderer 的实例。要么,

    • 使用工厂的渲染器和自定义的DateAxis

      private JFreeChart createChart(TimeTableXYDataset chartData) {
          JFreeChart chart = ChartFactory.createStackedXYAreaChart(
              "Dogs and Cats", "Time", "Count", chartData,
              PlotOrientation.VERTICAL, false, true, false);
          DateAxis dateAxis = new DateAxis();
          dateAxis.setDateFormatOverride(new SimpleDateFormat("HH:mm"));
          dateAxis.setTickLabelFont(dateAxis.getTickLabelFont().deriveFont(20f));
          XYPlot plot = (XYPlot) chart.getPlot();
          plot.setDomainAxis(dateAxis);
          return chart;
      }
      
    • createChart() 方法中重述工厂,如here 所示。

      private JFreeChart createChart(TimeTableXYDataset chartData) {
          DateAxis dateAxis = new DateAxis("Time");
          dateAxis.setDateFormatOverride(new SimpleDateFormat("HH:mm"));
          dateAxis.setTickLabelFont(dateAxis.getTickLabelFont().deriveFont(20f));
          NumberAxis yAxis = new NumberAxis("Count");
          XYToolTipGenerator toolTipGenerator = new StandardXYToolTipGenerator();
          StackedXYAreaRenderer2 renderer = new StackedXYAreaRenderer2(
              toolTipGenerator, null);
          renderer.setOutline(true);
          XYPlot plot = new XYPlot(chartData, dateAxis, yAxis, renderer);
          plot.setOrientation(PlotOrientation.VERTICAL);
          plot.setRangeAxis(yAxis);  // forces recalculation of the axis range
          JFreeChart chart = new JFreeChart("Dogs and Cats",
              JFreeChart.DEFAULT_TITLE_FONT, plot, false);
          new StandardChartTheme("JFree").apply(chart);
          return chart;
      }
      

    您能否详细说明为什么StackedXYRenderer 会导致卷曲?

    作者writes,“StackedXYAreaRenderer2 使用不同的绘图方法,为每个数据点计算一个多边形并填充它。”相比之下,StackedXYAreaRenderer 似乎通过用直线连接端点来关闭单个 Shape

    【讨论】:

    • 这行得通,谢谢!您能否详细说明为什么 StackedXYRenderer 会导致这种卷曲?
    • @KevinWorkman:很高兴为您提供帮助。我对它究竟是如何发生的有点模糊,但我已经在上面提出了解释。
    • 这种解释与我所看到的不谋而合:在具有大量数据点的图形上,因此图形的每个多边形都非常薄,您可以在图形上看到多边形不存在的垂直线伪影不太接触。我可以忍受这个。再次感谢!
    猜你喜欢
    • 2015-05-31
    • 2021-06-15
    • 2014-02-15
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    相关资源
    最近更新 更多