2010-03-12 24 views
7

Hiện tại, PolarChart nối tất cả các tọa độ với các đường tạo đa giác. Tôi chỉ muốn nó vẽ từng điểm bằng dấu chấm và KHÔNG tham gia cùng nhau. Điều này có thể không?Điểm số thay vì dòng? JFreeChart PolarChart

Tôi đã thử sử dụng translateValueThetaRadiusToJava2D() và Graphics2D để vẽ vòng kết nối nhưng nó rất khó khăn và có sức thuyết phục.

Bất kỳ đề xuất nào đều được chào đón!

Trả lời

7

Vì vậy, DefaultPolarItemRenderer lấy tất cả các điểm cực, chuyển đổi điểm cực sang tọa độ Java2D thông thường, tạo Polygon với các điểm đó và sau đó vẽ nó. Đây là cách tôi đã nhận nó để vẽ chấm thay vì một đa giác:

public class MyDefaultPolarItemRenderer extends DefaultPolarItemRenderer { 

    @Override 
    public void drawSeries(java.awt.Graphics2D g2, java.awt.geom.Rectangle2D dataArea, PlotRenderingInfo info, PolarPlot plot, XYDataset dataset, int seriesIndex) { 


     int numPoints = dataset.getItemCount(seriesIndex); 
     for (int i = 0; i < numPoints; i++) { 

      double theta = dataset.getXValue(seriesIndex, i); 
      double radius = dataset.getYValue(seriesIndex, i); 
      Point p = plot.translateValueThetaRadiusToJava2D(theta, radius, 
        dataArea); 
      Ellipse2D el = new Ellipse2D.Double(p.x, p.y, 5, 5); 
      g2.fill(el); 
      g2.draw(el); 
     } 
    } 
} 

và sau đó khởi tạo lớp này ở nơi khác:

MyDefaultPolarItemRenderer dpir = new MyDefaultPolarItemRenderer(); 
    dpir.setPlot(plot); 
    plot.setRenderer(dpir); 
2

Điều này khó hơn một chút. Với số PolarPlot, bạn có thể lấy số AbstractRenderer và đặt hình dạng. Ví dụ:

PolarPlot plot = (PolarPlot) chart.getPlot(); 
AbstractRenderer ar = (AbstractRenderer) plot.getRenderer(); 
ar.setSeriesShape(0, ShapeUtilities.createDiamond(5), true); 

Kim cương sẽ xuất hiện trong chú giải, nhưng DefaultPolarItemRenderer không hiển thị hình dạng, cũng không cung cấp điều khiển đường. Bạn sẽ phải mở rộng trình kết xuất đồ họa mặc định và ghi đè drawSeries(). XYLineAndShapeRenderer là ví dụ điển hình cho nghiên cứu; bạn có thể xem cách nó được sử dụng trong TimeSeriesChartDemo1.

Nếu đây là terra incognita cho bạn, tôi khuyên bạn nên The JFreeChart Developer Guide.

Tuyên bố từ chối trách nhiệm: Không liên kết với Object Refinery Limited; Tôi là một khách hàng hài lòng và là người đóng góp rất nhỏ.

+0

(oops, không biết định dạng messes lên tại đây) –

1

Đây là một cuộc thảo luận xuất sắc, trong trường hợp bạn muốn các chức năng để nhặt màu sắc bằng cách sử dụng giao cho loạt

add ...

Color c =(Color)this.lookupSeriesPaint(seriesIndex); 
g2.setColor(c); 

trước ...

g.draw(e1); 

có các chức năng khác ... mã sử dụng hoàn để xem những gì khác chức năng có sẵn đối với loạt rendereing với tên bắt đầu từ lookupSeries........(int seriesindex)

1

Tôi tìm thấy một cách khá lạ để có được những điểm mà không cần bất kỳ dòng kết nối chúng.

tôi đặt Stroke của renderer là một ranh giới mỏng manh, với một giai đoạn gạch ngang từ 0, và chiều dài của 1e10:

Stroke dashedStroke = new BasicStroke(
          0.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 
          0.0f, new float[] {0.0f, 1e10f}, 1.0f); 
renderer.setSeriesStroke(0, dashedStroke); 
Các vấn đề liên quan