IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Graphisme Java Discussion :

Cherche lib pour camemberts à angles fixes


Sujet :

Graphisme Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    gnome
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : El Salvador

    Informations professionnelles :
    Activité : gnome

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Par défaut Cherche lib pour camemberts à angles fixes
    Bonjour,

    Je cherche une bibliothèque capable de générer des diagrammes type camemberts, sur lesquels l'aire n'est pas déterminée par l'angle, mais par le rayon de chaque arc de cercle (les angles étant alors tous égaux).

    Je n'ai pas pas trouvé celà dans la documentation de jFreecharts (celle que j'aimerais utiliser).

    Avez-vous un idée à me donner ?
    Ou connaissez vous un lien qui répertorie de façon exhaustive tous les diagrammes que l'on peut faire avec jFreecharts ? (même la doc officielle ne semble pas complète)

    Merci
    Pascal

  2. #2
    Membre éclairé Avatar de TrYde
    Homme Profil pro
    Responsable de l'industrialisation logiciel
    Inscrit en
    Juillet 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de l'industrialisation logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 55
    Par défaut
    Bonjour,

    Si la doc de JfreeChart ne présente pas tous les graphiques possibles, c'est surtout parce qu'il est possible de faire des graphiques personnalisés en surchargeant des renderers / plots existants (exemple : PolarPlot).

    Pour le camembert, tout le boulot est fait dans la classe org.jfree.chart.plot.PiePlot, qu'il suffit donc de surcharger, notamment les méthodes drawItem() et drawPïe() qui sont protected, en modifiant la taille de l'item au lieu de l'angle.

    En espérant que ça peut aider.

    A+

  3. #3
    Membre confirmé
    Profil pro
    gnome
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : El Salvador

    Informations professionnelles :
    Activité : gnome

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Par défaut
    C'est une réponse intéressante.

    Mais j'avoue que je pensais trouver une type de diagramme prédéfini assez proche de ce que je rechzerche, sans avoir à le redéfinir.

    S'il le faut j'en passerai par là. Mais je ne me représente pas bien le temps nécessaire pour celà.

    Pascal

  4. #4
    Membre confirmé
    Profil pro
    gnome
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : El Salvador

    Informations professionnelles :
    Activité : gnome

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Par défaut
    Bonjour,

    Ne trouvant pas de librairie capable de faire ce que je souhaite (un diagramme à chaval entre le diagramme radar et le camembert, dont l'aire n'est pas déterminée par l'angle mais par le rayon de chaque arc de cercle), j'envisage la solution proposée par trYde.

    Pouvez-vous m'indiquer sommairement la marche à suivre pour surcharger les méthodes d'une librairie telle que jFreeCharts ?

    Je ne sais pas s'il faut partir du jar compilé, ou bien du code source de la lib, où il faut que je mette le nouveau code, s'il faut que je recompile la lib...etc.

    Merci de votre aide précieuse !

    Exemple de ce que je veux faire :
    Images attachées Images attachées  

  5. #5
    Membre éclairé Avatar de TrYde
    Homme Profil pro
    Responsable de l'industrialisation logiciel
    Inscrit en
    Juillet 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de l'industrialisation logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 55
    Par défaut
    Bonjour,

    JFreechart étant open-source, il est tout à fait possible de partir du code existant pour s'en inspirer. Les sources sont distribuées avec l'api. La nouvelle classe peut se trouver dans n'importe quel package, ce n'est pas important (il n'est pas nécessaire de toucher à la lib jfreechart)

    Actuellement, un PiePlot ne possède pas d'échelle car les valeurs sont des pourcentages. Mais dans votre cas, il faut probablement définir un min et un max, via un Axis.
    Exemple pour getter/setter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
        /**
         * Returns the axis for the plot.
         *
         * @return The radius axis (possibly <code>null</code>).
         * 
         * @see #setAxis(ValueAxis)
         */
        public ValueAxis getAxis() {
            return this.axis;
        }
     
        /**
         * Sets the axis for the plot and sends a {@link PlotChangeEvent} to all
         * registered listeners.
         *
         * @param axis  the new axis (<code>null</code> permitted).
         */
        public void setAxis(ValueAxis axis) {
            if (axis != null) {
                axis.setPlot(this);
            }
     
            // plot is likely registered as a listener with the existing axis...
            if (this.axis != null) {
                this.axis.removeChangeListener(this);
            }
     
            this.axis = axis;
            if (this.axis != null) {
                this.axis.configure();
                this.axis.addChangeListener(this);
            }
            notifyListeners(new PlotChangeEvent(this));
        }
    Ensuite il faut s'occuper du dessin. Vous allez probablement utiliser un PieDataset, qui n'est qu'une association (item-valeur). Donc il faut calculer l'angle de chaque part (360/nbItems) et le rayon (en fonction du min et du max), puis dessiner les parts. La méthode drawItem est celle à modifier.
    Pour un camembert elle calcule la taille des parts par rapport à la valeur, via le bout de code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            if (this.direction == Rotation.CLOCKWISE) {
                angle1 = state.getLatestAngle();
                angle2 = angle1 - value / state.getTotal() * 360.0;
            }
            else if (this.direction == Rotation.ANTICLOCKWISE) {
                angle1 = state.getLatestAngle();
                angle2 = angle1 + value / state.getTotal() * 360.0;         
            }
    Il faut déjà changer ça car l'angle (angle2 - angle1) est constant, donc la partie value / state.getTotal() * 360.0 est à changer.

    Ensuite il faut changer le rayon, pour cela il suffit de donner une zone plus petite (proportionellement et centrée sur la même position) à la méthode suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                Rectangle2D arcBounds = getArcBounds(state.getPieArea(), 
                        state.getExplodedPieArea(), angle1, angle, ep);
    Pour être fidèle à vos exemples, vous pouvez aussi calculer un arc de taille max pour chaque item (simple puisqu'il suffit de garder l'arcBounds d'origine) et n'en dessiner que le contour (avec g2.draw() et pas g2.fill()). Ainsi vous aurez le cercle complet.

    Le reste du code n'a pas besoin d'être changé.

    Bon courage

  6. #6
    Membre confirmé
    Profil pro
    gnome
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : El Salvador

    Informations professionnelles :
    Activité : gnome

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Par défaut
    Bonjour,

    Un grand merci pour cette réponse experte.

    Je vais tenter d'appliquer la recette indiquée et ferai un retour dès que possible. De ma réussite ou de mes problèmes !

    Très cordialement,
    Pascal

Discussions similaires

  1. [langage] cherche script pour formater une chaine
    Par MASSAKA dans le forum Langage
    Réponses: 7
    Dernier message: 12/11/2003, 12h18
  2. Debutant en C cherche aide pour fonctions!!!!
    Par benji17c dans le forum C
    Réponses: 5
    Dernier message: 30/09/2003, 12h47
  3. Réponses: 3
    Dernier message: 01/07/2003, 16h04
  4. Cherche conseil pour choisir mon orientation.
    Par AslDice dans le forum Débuter
    Réponses: 6
    Dernier message: 24/04/2003, 17h07
  5. [Kylix] cherche composants pour les sockets
    Par coriolis dans le forum EDI
    Réponses: 1
    Dernier message: 09/04/2003, 10h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo