Histogramme avec Java

Diansher Messages postés 3 Date d'inscription jeudi 22 février 2007 Statut Membre Dernière intervention 24 février 2007 - 23 févr. 2007 à 00:36
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 - 24 févr. 2007 à 22:35
Salut à tous, J#aimerais réaliser un histogramme avec Java, dont les bandes varient comme le modèl suivant:
http://www.stat.sc.edu/~west/javahtml/Histogram.html

Voici mon code source, mais rien ne passe. Quelqu'un peut-il m'aider?

import java.awt.*;
import java.applet.*;




public class Histogramm extends Applet
{
 final double H = 300;   
 final double W = 300;   
 double x1 = 250-W/2;   
 double y1 = 250-H/2;
 Color backgr = new Color(175,200,210); 
 Color foregr1 = new Color(0,0,60); 
 Color foregr2 = new Color(0,60,130); 




 
 public void init()
 {
  setBackground(backgr);
 }


 public void paint(Graphics g)
 {
  resize(500,500);     
  g.setColor(foregr1);
  String title = getParameter("title") + "  -  " + getParameter("subtitle");
  g.drawString(title,250-title.length()*3,60);   
  String dataStr = getParameter("data");    
  double[] dataArr = makeArray(dataStr);    
  double K = Double.parseDouble(getParameter("klassen"));  
  sort(dataArr);       
  double minX = Math.floor(dataArr[0]);    
          
  double maxX = Math.ceil(dataArr[dataArr.length-1]);   


  double[] frequency = verteilung(dataArr,K,g);   
  double maxY = coordSys(dataArr,frequency,minX,maxX,g);  
          
  draw(dataArr,frequency,minX,maxX,maxY,K,g);   
 }


 public double[] makeArray(String s) 
 {
  int anz = s.length()/5+1;    
  double[] data = new double[anz];   
  String sub;     


  for (int j=0; jmaxF)    
    maxF=frequency[i];   
  }
  if (maxF<=0.1) {     
   maxY=0.1;     
   step=0.01;
  } else if ((maxF>0.1)&(maxF<=0.5)) {
   maxY=Math.ceil(maxF*10)/10;   
         
   step=0.05;
  } else {
   maxY=Math.ceil(maxF*10)/10;
   step=0.1;
  }
  for(double j=0+step; j<=maxY; j+=step) {   
         
   y-=step*H/maxY;     
         
   g.drawLine((int)x1-2, (int)y, (int)x1+2, (int)y);  
   if (step<0.1)
    g.drawString(round(j,2), (int)x1-33, (int)y+5); 
   else      
    g.drawString(round(j,1), (int)x1-22, (int)y+5); 
  }
 
  
  double x = x1;      
  for(double k=minX; k<=maxX; k++) {   
   g.drawLine((int)x, (int)(y1+H-2), (int)x, (int)(y1+H+2)); 
   g.drawString(round(k,1), (int)x-8, (int)(y1+H+14)); 
   x+=W/(maxX-minX);    
  }
  return maxY;      
 }


 public String round(double x, int stellen)   
 {
  x=x*Math.pow(10,stellen);    
  long nearest=Math.round(x);   
  x=(double)nearest/Math.pow(10,stellen);  
  String str = ""+x;     
  while (str.length()<stellen+2) {   
   str+="0";    
  }
  return str;     
 }


 public double[] verteilung(double[] data, double K, Graphics g)  
 {
  double[] frequency = new double[(int)K];   
  double intervall = (data[data.length-1] - data[0]) / K;  
  for (int i=0; i<data.length; i++) {    
   int klasse = (int) ((data[i]-data[0])/intervall);  
   if (klasse==(int)K)    
         
    klasse=(int)K-1;    
   frequency[klasse]+=1/(double)data.length;  
  }
  return frequency;      
 }


 public void draw(double[] data, double[] frequency, double minX, double maxX, double maxY, double K, Graphics g)
 {
  double factor = W/(maxX-minX);    
  double startx = x1 + (data[0]-minX) * factor;  
         
  double stopx = x1 + (data[data.length-1]-minX) * factor;
  int hoehe, x;      
  double breite = (stopx-startx)/K;   
  for(int i=0; i<K; i++) {    
   x=(int)Math.round(startx+i*breite);    
   hoehe=(int)Math.round(frequency[i]*H/maxY);  
   g.setColor(foregr2);
   g.fillRect((int)x, (int)(y1+H-hoehe), (int)breite, (int)hoehe);
   g.setColor(foregr1);
   g.drawRect((int)x, (int)(y1+H-hoehe), (int)breite, (int)hoehe);
  }
 }
}

6 réponses

Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
23 févr. 2007 à 00:57
Salut:

Un petit conseil pourquoi se casser la tête tant qu'il y a une jolie bibliothèque qui fait ça avec perfection: JFreeChart




__________________________________________________________
A.B. :  La lumière voyage plus vite que le son. C'est pourquoi certainespersonnes paraissent brillantes jusqu'à ce qu'elles commencent à parler ...
0
Diansher Messages postés 3 Date d'inscription jeudi 22 février 2007 Statut Membre Dernière intervention 24 février 2007
23 févr. 2007 à 07:22
    Salut, merci pour ta reponse. En fait je le fais pour une TD à la fac et je dois ensuite expliquer ma programmation. Voilà pourquoi je dois impérativement avoir le code source de la procédure...
Une autre proposition?
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
23 févr. 2007 à 11:02
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />
<title>
</title>
<meta name="GENERATOR" content="OpenOffice.org 2.0 (Linux)" />
<meta name="AUTHOR" content="bob bob" />
<meta name="CREATED" content="20070223;10583900" />
<meta name="CHANGED" content="16010101;0" />
<style type="text/css">
<!--
@page { size: 21cm 29.7cm; margin: 2cm }
P { margin-bottom: 0.21cm }
-->
</style>
Salut,

le choix de
JFreeChart est aussi une bonne initiative de plus tu peux expliquer
pourquoi tu as choisi de faire avec, et pour l'explication du code
source tu peux expliquer comment piloter JFreeChart depuis un
applet... après c'est à toi de voir.








Concèrnant ton prob tu entend quoi par rien ne se passe ? si tu t'attend à voir un truc bouger lors d'un clique ou d'un dragg faudrait peut-etre le coder... sinon tu devrais éviter de faire appel à getParameter(xxx) dans le pain vu que les valeurs ne changeron pas tant que tu ne reload pas explicitement la page web....





------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
23 févr. 2007 à 11:54
Salut:

Il y a une chose que les gens ne sont pas conscient d'elle.



Je pense que JFreeChart est un projet Open Source, donc tu as le code devant toi, ce qui est une occasion pour voir comment les autres codent et par la suite progresser.



Mais si tu insiste voilà un petit lien:



http://www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Tech/Chapter06/histDemo.html




Cordialement ...




_____________________________________________________________________________
A.B. :  La lumière voyage plus vite que le son. C'est pourquoi certaines personnes paraissent brillantes jusqu'à ce qu'elles commencent à parler ...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Diansher Messages postés 3 Date d'inscription jeudi 22 février 2007 Statut Membre Dernière intervention 24 février 2007
24 févr. 2007 à 19:37
Merci à tous pour vos reponses, le plus important pour moi c'est de savoir comment d'expliquer le code. Et en plus je n'arrive pas à voir la totalité du code de JFreeChart, car lorsque  je le copie pour le coller dans un éditeur JAVA, il me donne des érreurs...
Quelqu'un peut-il m'aider?
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
24 févr. 2007 à 22:35
Salut:

Normalement, ça devrait être un problème d'ajout du JAR de JFreeChart.



______________________________________________________________________________
A.B. :  La lumière voyage plus vite que le son. C'est pourquoi certaines personnes paraissent brillantes jusqu'à ce qu'elles commencent à parler ...
0
Rejoignez-nous