JFreechart-带有颜色图的极坐标图

时间:2018-12-03 12:41:16

标签: java jfreechart colormap

我正在尝试获得与在Polar()函数上但在Java中添加的matlab Pcolor等效的方法。

我是该语言的新手,但是已经设法通过以下代码获取了极坐标图:

public class Polar extends JFrame {

 public Polar(double[][] vec){

  XYDataset dataset = getXYDataset(vec);
  JFreeChart chart = ChartFactory.createPolarChart("test", dataset, true, true, true);
  PolarPlot plot = (PolarPlot) chart.getPlot();
  DefaultPolarItemRenderer render = (DefaultPolarItemRenderer)
  plot.getRenderer();
  render.setFillComposite(...);
  render.setSeriesFilled(0,true);
  ChartPanel panel = new ChartPanel(chart);
  panel.setMouseZoomable(false);
  setContentPane(panel);

 }

 private XYDataset getXYDataset(double[][] vec){
  XYSeriesCollection dataset = new XYSeriesCollection();
  XYSeries faultDP =new XYSeries("Serie1");
  for(int i = 0; i<vec.length; i++){
   faultDP.add(vec[i][1],vec[i][0]);
  }
  dataset.addSeries(faultDP);
  return dataset;
 }
}

数组vec包含我变量的速度和角度,应在极坐标图上进行绘制。这很好。

下一步是传递一个新变量,尺寸为90x360的double [] []向量。每个单元格都应在极坐标图上绘制背景色值,如下图所示。

Example of colormap

有关如何操作的任何想法?

干杯, Flo

1 个答案:

答案 0 :(得分:0)

所以,我研究了垃圾桶提供给我的东西,并附带了以下代码:

public class PolarTest extends JFrame {

public PolarTest(double[][] dipaz, double[][] val){

JFrame f = new JFrame("Title");
ChartPanel panel = new ChartPanel(createChart(val, dipaz));
panel.setPreferredSize(new Dimension(500,500));
f.add(panel);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);


}

private JFreeChart createChart(double[][] val,double[][] dipaz){
    XYSeriesCollection dataset = new XYSeriesCollection ();
    double step, min, max;
    min  = val[0][2];
    max = val[val.length-1][2];
    step = (max-min)/10; //creation of 10 areas of similar heat range
    dataset = (XYSeriesCollection) createDataset(val,step);

    JFreeChart chart = ChartFactory.createPolarChart("test", dataset, true, true, true);
    PolarPlot plot = (PolarPlot) chart.getPlot();
    DefaultPolarItemRenderer r = (DefaultPolarItemRenderer) plot.getRenderer();
    r.setFillComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,0.5f));

    for(int i =0; i<dataset.getSeriesCount(); i++){
        r.setSeriesFilled(i, true);
        r.setShapesVisible(false);
        r.setDrawOutlineWhenFilled(false);
    }

    NumberAxis rangeAxis = (NumberAxis) plot.getAxis();
    rangeAxis.setTickLabelsVisible(false);
    return chart;
}  

private XYDataset createDataset(double[][] val, double step){
 XYSeriesCollection result = new XYSeriesCollection();
 double dpTmp, breakPoint;
 int cpt=1;
 boolean t;

 t= true;

 dpTmp = val[0][2];
 breakPoint = dpTmp + step;
 XYSeries series = null ;

 for(int i = 0; i< val.length; i++){
    if(val[i][2] < breakPoint){
        if(t){
         series = new XYSeries(String.valueOf(cpt));
         t = false;
        }
       series.add(val[i][1],val[i][0]);
       cpt++;
    }else{
       result.addSeries(series);
       i--;
       t=true;
       breakPoint = val[i][2] + step;
    }
 }
 return result;
}

数组dipaz包含我的角度和倾角(我想稍后在极坐标表示上绘制的X,Y点的角度),而将3 x N数组设为val: val[][0] =蘸 val[][1] =角度 val[][2] =“热量”的值,如果我们将该问题视为热图。

val按第三列升序排列。我的想法是将整个阵列分成10个(或更多)相似热值区域。

如果运行此代码,则将获得以下输出(参见图片)。我们可以看到它正在到达那里,但还不完全是。我不确定这段代码是否可以将我的热量正确地映射到极坐标上>

enter image description here

我怎样才能更接近我在第一篇文章中发布的图片?

感谢您的帮助。 Flo