如何在不扩大关节的情况下在 JFreeChart 中设置自己的颜色?

How to set my own color in JFreeChart without enlarged joints?

我的示例代码如下所示,我想设置自己的颜色,但是它带有放大的关节,如何设置自己的颜色,而不放大关节?

import java.awt.*;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.*;
import org.jfree.data.time.Day;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;

public class Time_Series_Chart extends JFrame
{
  private static final long serialVersionUID=1L;
  static boolean EXIT_ON_CLOSE_B=true;

  public Time_Series_Chart(String title)
  {
    super(title);
    XYDataset dataset=createDataset();
    JFreeChart chart=ChartFactory.createTimeSeriesChart("Time_Series_Chart",             // Create chart
                                                        "Date",                          // X-Axis Label
//                                                      "Number",                        // Y-Axis Label
                                                        getYLabel("Number"),             // Y-Axis Label
                                                        dataset);
    XYPlot plot=(XYPlot)chart.getPlot();
    plot.setBackgroundPaint(new Color(130,130,130));                                     // Changes background color
/*
    XYLineAndShapeRenderer renderer=new XYLineAndShapeRenderer();
    renderer.setSeriesPaint(0,Color.yellow);
    renderer.setSeriesPaint(1,Color.green);
    renderer.setSeriesPaint(2,new Color(200,20,200));
    
    renderer.setSeriesStroke(0,new BasicStroke(0.5f));
    renderer.setSeriesStroke(1,new BasicStroke(0.5f));
    renderer.setSeriesStroke(2,new BasicStroke(0.5f));
    
    plot.setRenderer(renderer);            // <-- Comes with enlarged joints, not good.
*/
    ChartPanel panel=new ChartPanel(chart);
    setContentPane(panel);
  }

  private XYDataset createDataset()
  {
    TimeSeriesCollection dataset=new TimeSeriesCollection();

    TimeSeries series1=new TimeSeries("Series1");
    series1.add(new Day(1,1,2017),50);
    series1.add(new Day(2,1,2017),40);
    series1.add(new Day(3,1,2017),45);
    series1.add(new Day(4,1,2017),30);
    series1.add(new Day(5,1,2017),350);
    series1.add(new Day(6,1,2017),45);
    series1.add(new Day(7,1,2017),60);
    series1.add(new Day(8,1,2017),45);
    series1.add(new Day(9,1,2017),55);
    series1.add(new Day(10,1,2017),48);
    series1.add(new Day(11,1,2017),60);
    series1.add(new Day(12,1,2017),45);
    series1.add(new Day(13,1,2017),65);
    series1.add(new Day(14,1,2017),45);
    series1.add(new Day(15,1,2017),55);
    dataset.addSeries(series1);

    TimeSeries series2=new TimeSeries("Series2");
    series2.add(new Day(1,1,2017),40);
    series2.add(new Day(2,1,2017),35);
    series2.add(new Day(3,1,2017),26);
    series2.add(new Day(4,1,2017),45);
    series2.add(new Day(5,1,2017),40);
    series2.add(new Day(6,1,2017),35);
    series2.add(new Day(7,1,2017),45);
    series2.add(new Day(8,1,2017),48);
    series2.add(new Day(9,1,2017),31);
    series2.add(new Day(10,1,2017),32);
    series2.add(new Day(11,1,2017),21);
    series2.add(new Day(12,1,2017),35);
    series2.add(new Day(13,1,2017),10);
    series2.add(new Day(14,1,2017),25);
    series2.add(new Day(15,1,2017),15);
    dataset.addSeries(series2);

    return dataset;
  }

  String getYLabel(String Text)
  {
    String Result="";
    
    for (int i=0;i<Text.length();i++) Result+=Text.charAt(i)+(i<Text.length()-1?"\u2009":"");
//    Out(Result);
    return Result;
  }
  
  private static void out(String message) { System.out.print(message); }
  private static void Out(String message) { System.out.println(message); }

  public static void main(String[] args)
  {
    SwingUtilities.invokeLater(() ->
    {
      Time_Series_Chart demo=new Time_Series_Chart("Time_Series_Chart");
      demo.setSize(800,400);
      if (EXIT_ON_CLOSE_B) demo.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      demo.setLocationRelativeTo(null);
      demo.setVisible(true);
    });
  }
}

我找到了答案:

renderer.setSeriesShapesVisible(0,false);
renderer.setSeriesShapesVisible(1,false);

一些备选方案:

  • 获取对所选图表工厂现有渲染器的引用并显式调用setDefaultShapesVisible(false)

    XYPlot plot=(XYPlot)chart.getPlot();
    …
    XYLineAndShapeRenderer r = (XYLineAndShapeRenderer) plot.getRenderer();
    r.setDefaultShapesVisible(false);
    r.set…
    
  • 创建您自己的工厂,如图所示 here, using the original 作为指南。请注意,工厂已经指定线条应该可见,但形状不可见。

    XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(true, false);