2010-03-12 18 views
7

Actualmente, PolarChart une todas las coordenadas con líneas que crean un polígono. Solo quiero que trazar cada punto con un punto y NO juntarlos. es posible?¿Parcela puntos en lugar de líneas? JFreeChart PolarChart

He intentado usar translateValueThetaRadiusToJava2D() y Graphics2D para dibujar círculos, pero es muy torpe y artificial.

¡Todas las sugerencias son bienvenidas!

Respuesta

7

Así que la DefaultPolarItemRenderer toma en todos los puntos polares, convierte los puntos de coordenadas polares a Java2D regulares, hace un Polygon con esos puntos y luego dibuja. Así es como llegué a dibujar puntos en lugar de un polígono:

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); 
     } 
    } 
} 

y luego crea una instancia de esta clase en otra parte:

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

Esta es un poco más difícil. Dado un PolarPlot, puede obtener su AbstractRenderer y establecer la forma. Por ejemplo,

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

El diamante aparecerá en la leyenda, pero el DefaultPolarItemRenderer ni hace que las formas, ni proporciona un control de línea. Tendría que extender el renderizador predeterminado y anular drawSeries(). XYLineAndShapeRenderer es un buen ejemplo de estudio; puede ver cómo se usa en TimeSeriesChartDemo1.

Si esto es terra incognita a usted, me gustaría recomendar The JFreeChart Developer Guide.

de responsabilidad: No afiliado con objeto Refinería Limited; Soy un cliente satisfecho y colaborador de poca importancia.

+0

(Vaya, no sabía el formato mete hasta aquí) –

1

Esta es una excelente discusión, en caso de que desea que la función de recoger el color asignado por el usuario a la serie

complemento ...

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

antes ...

g.draw(e1); 

hay otras funciones ... el uso de finalización de código para ver qué más funciones están disponibles contra la serie rendereing con el nombre partir de lookupSeries........(int seriesindex)

1

he encontrado una manera un tanto extraña para obtener los puntos sin ningún tipo de líneas de conexión ellos.

que establezca la Stroke del renderer a ser una línea delgada, con una pizca de fase 0, y la longitud de 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); 
Cuestiones relacionadas