2017-04-03 3 views
1

Mon problème: En utilisant , j'ai besoin d'afficher les seuils de pourcentage espacés de façon inégale sur l'axe des ordonnées. Par exemple, les seules étiquettes sur mon axe des y devraient être les seuils comme suit; toutes les autres coordonnées doivent être vides:Seuils de pourcentage personnalisés sur l'axe des y avec un espacement irrégulier

- 
93% 
85% 
78% 
72% 
66% 
- 
50% 
- 
- 
- 
- 
- 

J'utilise actuellement cet extrait de code pour l'affichage des pourcentages, mais cela suffit de créer un axe de pourcentage uniformément espacés:

CategoryPlot plot = (CategoryPlot) chart.getPlot(); 

    NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); 
    DecimalFormat pctFormat = new DecimalFormat("#.0%"); 
    rangeAxis.setNumberFormatOverride(pctFormat); 

Toute aide serait appréciée!

+0

Vous voulez toujours 50% à être moitié et 80% à quatre cinquièmes, etc.? – trashgod

+0

Oui, le positionnement relatif ne doit pas changer (pas d'échelle logarithmique), c'est juste que seuls les seuils importants doivent avoir une étiquette. – ptstone

+0

Peut-être essayer 'SymbolAxis', suggéré [ici] (http://stackoverflow.com/q/2365657/230513). – trashgod

Répondre

1

Il s'agit d'une réponse un peu hachée, et je vais rehausser toute réponse qui obtient le même résultat dans le bon sens. Mais ça marche - voici ce que j'ai fait.

D'abord, j'ai créé une liste des doubles valeurs que je voulais utiliser:

public static List<Double> m_lPercentageValuesForY = Arrays.asList(0.1,0.2,0.3,0.4,0.5,0.58,0.66,0.70,0.74,0.78,0.82,0.95,1.0); 

i écraser ensuite la méthode refreshTicks dans NumberAxis d'abord régler tous les tiques à défaut Ticktype.MINOR, puis ajouter et créer mes coches personnalisées avec Ticktype.MAJOR:

NumberAxis axisLeft = new NumberAxis(plot.getRangeAxis().getLabel()) { 
     @Override 
     public List refreshTicks(
       Graphics2D g2, 
       AxisState state, 
       Rectangle2D dataArea, 
       RectangleEdge edge) { 

      List defaultTicks = super.refreshTicks(g2, state, dataArea, edge); 
      List customTicks = new ArrayList(); 

      for (Object aTick : defaultTicks) { 
       NumberTick currenttick = (NumberTick) aTick; 

       customTicks.add(new NumberTick(
         TickType.MINOR, 
         currenttick.getValue(), 
         "", //empty 
         currenttick.getTextAnchor(), 
         currenttick.getRotationAnchor(), 
         currenttick.getAngle())); 
      } 
      NumberTick aTick = (NumberTick) defaultTicks.get(0); 
      for (double dTest : m_lPercentageValuesForY) { 
       customTicks.add(new NumberTick(
         TickType.MAJOR, 
         dTest, 
         String.format("%.0f%%", dTest * 100), //only wanted values are set to major 
         aTick.getTextAnchor(), 
         aTick.getRotationAnchor(), 
         aTick.getAngle())); 
      } 
      return customTicks; 
     } 
    }; 
    plot.setRangeAxis(axisLeft); 
+0

Une approche similaire est suggérée [ici] (http://stackoverflow.com/a/22610568/230513). – trashgod

+0

Merci d'avoir trouvé cela, et c'est même du créateur de jfreechart lui-même! J'espérais qu'il existait un moyen officiel de créer un axe entièrement personnalisé, mais cette exigence était probablement trop rare ou spécifique pour justifier une méthode ou une classe. Depuis que je viens de rejoindre stackoverflow, est-ce correct de marquer ce fil réponse même si la réponse est par moi-même et pas terrible? – ptstone

+0

Vous êtes encouragé à [répondre à votre propre question] (http://meta.stackoverflow.com/q/17463/163188); vous pouvez accepter cette réponse en cliquant sur la [coche vide] (http://meta.stackoverflow.com/a/5235/163188) à gauche; vous pouvez accepter une autre réponse plus tard si vous le souhaitez. – trashgod