【问题标题】:JFreechart - Polar plot with a colormapJFreechart - 带有颜色图的极坐标图
【发布时间】:2018-12-05 22:05:39
【问题描述】:

我正在尝试在 java 中获得在 polar() 函数上添加的 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[][] 向量。每个单元格都应该用背景颜色值绘制在极坐标图上,有点像下图。

你知道怎么做吗?

干杯, 弗洛尔

【问题讨论】:

  • 我是这样看的,只是对如何实现它感到很困惑。
  • 可能是PaintScaleLegend,对于example
  • 之前也看过那个例子。这是一个很好的,我只是想知道如何在我的情况下显示我的颜色图。对不起,我真的是java新手......
  • Si 我尝试使用 PainScaleLegend 类,但是当我尝试在极坐标渲染器上使用它时,我需要将 SpectrumPaintScale ps 转换为 Paint 对象 (r.setPaintScale((Paint)ps);) ,以获得我的代码编译了,即使这样,它也不起作用。我正在取得进展,但还没有完全达到。
  • 作为参考,这里还有几个PolarPlotexamples,但您可能需要查看自定义极坐标图,它可以按照您需要的方式呈现合适的XYZDataset。抱歉,除了jfreechart 本身,我不知道任何其他示例。

标签: java jfreechart colormap


【解决方案1】:

所以,我查看了垃圾神提供给我的内容并附带了以下代码:

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 点),而 val 是 3 x N 数组: val[][0] = 倾角 val[][1] = 角度 val[][2] = "heat" 的值,如果我们将该问题视为热图。

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

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

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

感谢您的帮助。 弗洛尔

【讨论】:

    猜你喜欢
    • 2022-07-25
    • 1970-01-01
    • 2020-10-25
    • 2018-06-04
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    相关资源
    最近更新 更多