2014-07-22 6 views
1

Tenter d'utiliser AndroidPlot pour créer un nuage de points XY, rencontrer un problème ... où l'intrigue ne dessine que des points de gauche à droite, un tableau de défilement essentiellement.XY Scatter AndroidPlot

Exemple ... disons que j'ai les coordonnées suivantes, (0,1), (1,0), (0, -1), (-1,0) Je m'attendrais à voir une forme de diamant (Si tous les points ont été joints par une ligne)

J'ai déjà utilisé la bibliothèque AndroidPlot avec succès, donc je suis assez familier avec les méthodes disponibles.

Existe-t-il des exemples de nuage de points utilisant la bibliothèque AndroidPlot?

espère que je sens ici .. faire

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Collection; 

import pl.flex_it.androidplot.XYSeries; 

import com.androidplot.series.XYSeries; 
import com.androidplot.xy.BoundaryMode; 
import com.androidplot.xy.LineAndPointFormatter; 
import com.androidplot.xy.SimpleXYSeries; 
import com.androidplot.xy.XYPlot; 

import android.app.Fragment; 
import android.graphics.Color; 
import android.os.Bundle; 

import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

    public class Temp extends Fragment { 

     private static XYPlot xyPlot; 
     private XYSeriesShimmer series; 
     private LineAndPointFormatter series1Format; 
     private ArrayList<Number> ALdata1, ALdata2; 
     private int Adata1[], Adata2[]; 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

      View rootView = inflater.inflate(R.layout.fragment_test, container, false); 

      // Import plot from the layout 
      xyPlot = (XYPlot) rootView.findViewById(R.id.xyPlot); 
      xyPlot.setDomainBoundaries(-2, 2, BoundaryMode.FIXED); // freeze the domain boundary: 
      xyPlot.setRangeBoundaries(-2, 2, BoundaryMode.FIXED); 

      ALdata1 = new ArrayList<Number>(); 
      ALdata2 = new ArrayList<Number>(); 
      ALdata1.clear(); 
      ALdata2.clear(); 

      Adata1 = new int[]{0,1,0,-1}; 
      Adata2 = new int[]{1,0,-1,0}; 

      series = new XYSeriesShimmer(ALdata1, ALdata2, 0, "Sightings in USA"); 
      series1Format = new LineAndPointFormatter(Color.TRANSPARENT, Color.BLACK, null); // line color, point color, fill color 
      xyPlot.addSeries(series, series1Format); 

      plotDataMethod(); 

      return rootView; 
     } 

     private void plotDataMethod() { 

      for(int i=0; i<Adata1.length; i++){ 
       ALdata1.add(Adata1[i]); 
       ALdata2.add(Adata2[i]); 

       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

       series.updateData(ALdata1, ALdata2); 
       xyPlot.redraw(); 
      } 

     } 

    } 

EDIT:

package pl.flex_it.androidplot; 

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 

import com.androidplot.series.XYSeries; 

public class XYSeriesShimmer implements XYSeries { 
    private List<Number> dataX; 
    private List<Number> dataY; 
    private int seriesIndex; 
    private String title; 

    public XYSeriesShimmer(List<Number> datasource, int seriesIndex, String title) { 
     this.dataY = datasource; 
     this.seriesIndex = seriesIndex; 
     this.title = title; 
    } 

    public XYSeriesShimmer(List<Number> datasourceX, List<Number> datasourceY, int seriesIndex, String title) { 
     this.dataX = datasourceX; 
     this.dataY = datasourceY; 
     this.seriesIndex = seriesIndex; 
     this.title = title; 
    } 

    @Override 
    public String getTitle() { 
     return title; 
    } 

    @Override 
    public int size() { 
     return dataY.size(); 
    } 

    @Override 
    public Number getY(int index) { 
     return dataY.get(index); 
    } 

    @Override 
    public Number getX(int index) { 
     return index; 
    } 

    public void updateData(List<Number> datasourceX){ //dont need to use this cause, the reference is only stored, modifying the datasource externally will cause this to be updated as well 
     this.dataY=datasourceX; 
    } 

    public void updateData(List<Number> datasourceX, List<Number> datasourceY){ //dont need to use this cause, the reference is only stored, modifying the datasource externally will cause this to be updated as well 
     this.dataX=datasourceX; 
     this.dataY=datasourceY; 
    } 

} 
+1

Cette ligne semble suspect et shouldnt même compilation: série = new XYSeries (ALdata1, ALdata2, 0, "Sightings aux Etats-Unis"); <- Est-ce vraiment un nouveau SimpleXYSeries par hasard? – Nick

+0

Merci pour l'aide Nick. J'ai étendu la classe XYSeries pour prendre une liste Xaxis et une liste Yaxis voir EDIT ci-dessus. La bibliothèque androidPlot peut sûrement tracer des points épars au lieu de seulement tracer de gauche à droite, je suppose donc je suis sûr que je manque quelque chose de simple. Y a-t-il un exemple de diagramme de dispersion que vous connaissez? – Strokes

Répondre

2

Cela ressemble à cela pourrait être le problème - dans XYSeriesShimmer:

@Override 
public Number getX(int index) { 
    return index; 
} 

C'est toujours aller à i, ce qui signifie que la valeur x de chaque élément est 1 plus grande que la précédente ... exactement ce que vous éprouvez . Essayez de changer à ceci:

@Override 
public Number getX(int index) { 
    return dataX.get(i); 
} 
+0

Succès! Salut Nick – Strokes