Wykresy w JAVIE

0

Witam
Mam listę:
List<Double> dane = new ArrayList<Double>();
Chciałbym narysować wykres: Oś x: i Oś y: dane[i]

Może ktoś powiedzieć jak to zrobić? Obojętne czy wykres na konsoli czy do GUI

Dzięki

0

Jest kilka rozwiązań po pierwsze wspomniany JFreeChart. Bardzo fajny i elastyczny. Do tego zintegrowano go już chyba ze wszystkim i jest dużo tutoriali.
Drugim niezwykle przydatnym narzędziem jest Google Chart: http://code.google.com/intl/pl/apis/chart/ Ma on ta zaletę, że nie obciąża twojego komputera/serwera ponad miarę, a tylko w zakresie potrzebnym do komunikacji z wujkiem Googlem.
Trzecim, którego używałem jest JOpenChart: http://sourceforge.net/projects/jopenchart całkiem fajny, ale od dawna nie jest rozwijany i trzeba na początek trochę posiedzieć przy kodzie i go podrasować.

0

Witam,
Jestem bardzo początkująca... Napisałam program i kompletnie nie mam pojęcia dlaczego nie działa. Poniżej kod.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package wykresy;
import java.awt.*;
import java.util.*;
import javax.swing.*;
import java.text.*;
/**
 *
 * @author Sandra
 */
public class Wykresy {
 public static int TableOfResults[][];
 public static int  Nmax, Hrozmiar;
    /**
     * @param args the command line arguments
     */
	
	static int select(int T[],int n) {
            
		int min,i,j,temp, s=0;
           
		for (i=0; i<49; i++)	{
			min=i;
                     
			for (j=i+1;j<50;j++)
                        { s++;
				if (T[j]<T[min]) 
					min=j;
			temp=T[min];
			T[min]=T[i];
			T[i]=temp;}
                      
	   }
                return s;
	
        }
 
    public static void main(String[] args){
   
   
        
    final int p = 100;
    final int h = 5;
    
    int []T;
    int []Ts;
    int [][]results;
    int IndexTs = 0;
    int TsDominate = 0;
    
    
    Random generator = new Random();
    
    int N;
    int LowerLimit, UpperLimit;
    int i, j, k;
    
    float avarage;
    
    JOptionPane.showMessageDialog(null, "Analiza porównacza algorytmów: CountSort i SelectSort\n");
    
    String Size;
    
    Size = JOptionPane.showInputDialog("Podaj liczbę elementów tablicy");
    
    String LimitLower;
    
    LimitLower = JOptionPane.showInputDialog("Podaj dolną granicę");
    
    String LimitUpper;
    
    LimitUpper = JOptionPane.showInputDialog("Podaj górną granicę");
    
    N = Integer.valueOf(Size).intValue();
    LowerLimit = Integer.valueOf(LimitLower).intValue();
    UpperLimit = Integer.valueOf(LimitUpper).intValue();
    
    T = new int[N];
    Ts = new int[p];
    results = new int[N][3];
    
    
    
    for(i = h; i<N; i=i+h)
    {   IndexTs = 0;
            for(k=1; k<=p; k++, IndexTs++)
            {   for(j=0; j<=i-1; j++)
                    T[j] =( int) (generator.nextFloat()* (UpperLimit - LowerLimit) + LowerLimit);
                    TsDominate = select(T, i);
                    Ts[IndexTs] = TsDominate;
            }
            
            avarage = 0;
           for(j = 0; j<=p-1; j++)
               avarage = avarage + Ts[j];
               avarage = avarage / p;
               
               results[i][0] = i;
               results[i][1] = (int)avarage;
               results[i][2] = (i*i-i)/2;
    
    }
    
        NumberFormat FormatLiczbyInteger = NumberFormat.getNumberInstance();
        FormatLiczbyInteger.setMinimumIntegerDigits(6);
        String ZnakowyZapisLiczby;
        
        System.out.println("Wyniki: koszt czasowy algorytmu Select Sort określony przez pomiar i analityczni");
        System.out.println("\t|Rozmiar tablicy|Operacje dominujące|Analityczny koszt czasowy|");
        
        for(j=0; j<N; j++)
        if(j%h ==0)
        {
        System.out.print("\t| ");
        ZnakowyZapisLiczby = FormatLiczbyInteger.format(results[j][0]);
        System.out.print(ZnakowyZapisLiczby);
         System.out.print("\t|\t");
        ZnakowyZapisLiczby = FormatLiczbyInteger.format(results[j][1]);
        System.out.print(ZnakowyZapisLiczby);
         System.out.print("\t\t|\t ");
        ZnakowyZapisLiczby = FormatLiczbyInteger.format(results[j][2]);
        System.out.print(ZnakowyZapisLiczby);
        System.out.print("\t| ");
        }
         
        System.out.println();
        
        TableOfResults = results;
        Nmax = N;
        Hrozmiar = h;
        
      
       FunctionPicture wykres=new FunctionPicture();
       wykres.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       wykres.setVisible(true);
  
       
    }
 
    

}

class FunctionPicture extends JFrame{
   
    public void FunctionPicture()
    {
        Toolkit narzedzia=Toolkit.getDefaultToolkit();
        Dimension monitor=narzedzia.getScreenSize();
        int heightMonitor=monitor.height;
        int widthMonitor=monitor.width;
        setSize(widthMonitor-50, heightMonitor-30);
        setLocation(20, 20);
        setTitle("Porównanie złożoności obliczeniowej SelectSort i CountSort");
        Container areaOfmyFrame=getContentPane();
        PaneOfPicture picture = new PaneOfPicture();
        areaOfmyFrame.add(picture);
    }
    
}
class PaneOfPicture extends JPanel{
    @Override
   public void paintComponent(Graphics g){
       int Xmax, Xmin, Ymax, Ymin;
       Xmax=size().width-20;
       Xmin=20;
       Ymin=20;
       Ymax=size().height-20;
       
       
       
       System.out.println("Wejście do paintComponent");
       super.paintComponent(g);
       Color colorOfFunction;
       colorOfFunction=Color.blue;
       g.setColor(colorOfFunction);
       
       g.drawLine(Xmin, Ymax, Xmax, Ymax);
       g.drawLine(Xmin, Ymax, Xmin, Ymin);
       
       colorOfFunction=Color.black;
       g.setColor(colorOfFunction);
       
       g.drawString("Rozmiar zadania n", (Xmax - 100), (Ymax - 5));
       g.drawString("Wartość kosztu t(n)", (Xmax + 10), (Ymax + 10));
       
       colorOfFunction=Color.BLUE;
       g.setColor(colorOfFunction);
       Font SerifBold14=new Font("SansSerif", Font.BOLD, 24);
       g.setFont(SerifBold14);
       g.drawString("Wykres kosztu czasowego t(n)", (Xmax/4), (Xmin+20));
       
       colorOfFunction=Color.RED;
       g.setColor(colorOfFunction);
       
       
       float scaleX, scaleY;
       scaleX = (float)(Xmax - Xmin)/ (float)Wykresy.Nmax;
      
       System.out.println("Skala OX" + scaleX);
       
       int MaxTs = 1;
       int j = 0;
        for(j=0;j<Wykresy.Nmax;j=j+Wykresy.Hrozmiar)
            MaxTs = Wykresy.TableOfResults[j][1];
            System.out.println("" + MaxTs);
            scaleY=(float)(Ymax-Ymin)/(float)MaxTs;
            System.out.println("Skala Y " +scaleY);
            
        for(j=0;j<Wykresy.Nmax-Wykresy.Hrozmiar;j=j+Wykresy.Hrozmiar)
        
        try{g.drawLine((int)(Xmin+scaleX *(Wykresy.TableOfResults[j][0])), 
                (int)(Ymax-scaleY *(Wykresy.TableOfResults[j][1])),
                (int)(Xmin+scaleX *(Wykresy.TableOfResults[j+Wykresy.Hrozmiar][0])),
                (int)(Ymax-scaleY *(Wykresy.TableOfResults[j+Wykresy.Hrozmiar][1])));
        
        }catch(ArrayIndexOutOfBoundsException e)
        {
            System.out.println("Error");
        }
        
        }
       
       
   }  
0
  1. Dość głupio umieściłaś pytanie, mógł tu już nikt nie zajrzeć.
  2. W klasie FunctionPicture brakuje konstruktora, jest zatem używany konstruktor domyślny. Zamień
public void FunctionPicture()
//na
public FunctionPicture()
  1. Program ma też inne usterki, np. bardzo często metoda select() generuje IndexOutOfBoundsException
  • nie wiadomo jakie wartości należy wprowadzać w okienkach dialogowych.
0

Na razie nie mam możliwości sprawdzić, podanego przez Ciebie rozwiązania, ale bardzo dziękuję za odpowiedź.

Metoda select została napisana według zalecenia wykładowcy.

A napisałam w tym temacie, bo nie chciałam niepotrzebnie mnożyć wątków, przecież i tak temat, do którego dodaje się post przesuwa się na początek.

Pozdrawiam,
S.

0

W metodzie select() są magiczne stałe 49 i 50. Żeby metoda nie rzucała wyjątkiem w tablicy T musi być co najmniej 50 elementów, a TY nigdzie nie sprawdzasz czy tak jest.

0

w select umieszciłam:

  static int select(int T[],int n) {
 
                int min,i,j,temp, s=0;
 
                for (i=0; i<n-1; i++)        {
                        min=i;
 
                        for (j=i+1;j<n;j++)
                        { s++;
                                if (T[j]<T[min]) 
                                        min=j;
                        temp=T[min];
                        T[min]=T[i];
                        T[i]=temp;}
 
           }
                return s;
 
        }
 

Wykres się rysuje, jeszcze muszę zrobić skalę, ale to napiszę, jeśli będę miała jakiś problem z tym.

0

Czy wiecie, jak w jfreechart przesłać tablicę danych do rysowania wykresu? Mam taki fragment:

   if(combobox.getSelectedItem()=="SelectSort")
 
      {
          for(x=0;x<Nmax-5;x=x+5)
          series.add(x, TableOfResults[x][2]);
      }

1 użytkowników online, w tym zalogowanych: 0, gości: 1