2013-08-02 7 views
5

जावाएफएक्स चार्ट का उपयोग करके चार्ट, मुझे एक स्टैक्ड एरिया चार्ट के वाई-अक्ष को उलटा करने की आवश्यकता है ताकि सकारात्मक शून्य शीर्ष पर हो और सकारात्मक संख्या वाई-अक्ष पर नीचे की ओर काम करे। नीचे जो मैं हासिल करने की कोशिश कर रहा हूं उसका एक मजाक है।उलटा वाई अक्ष

Inverted Y-Axis with positive numbers

सबसे अच्छा (पढ़ें: कम से कम विकास समय और उच्च कोड-पुन: उपयोग) क्या है रास्ता JavaFX में इस लक्ष्य को हासिल करने के लिए?

अद्यतन

ऋणात्मक संख्याओं के लिए डेटा परिवर्तित एक विकल्प नहीं है। मैं उन उत्तरों की तलाश में हूं जो सकारात्मक संख्याओं के साथ काम करेंगे, "छेड़छाड़ नहीं।"

उत्तर

2

आप नियमित अक्षों के साथ नियमित अक्ष का उपयोग कर सकते हैं, लेकिन TickLabelFormatter जोड़ें जो शून्य चिह्न को पट्टी देगा।

final NumberAxis yAxis = new NumberAxis(-25, 0, 5); 

    yAxis.setTickLabelFormatter(new NumberAxis.DefaultFormatter(yAxis) { 
     @Override 
     public String toString(Number value) { 
      // note we are printing minus value 
      return String.format("%7.1f", -value.doubleValue()); 
     } 
    }); 

    series1.getData().add(new XYChart.Data("Jan", -1)); 
    series1.getData().add(new XYChart.Data("Feb", -5)); 
    series1.getData().add(new XYChart.Data("Mar", -20)); 
+0

क्या आप सुझाव दे रहे हैं कि मैं चार्ट में इसका उपयोग करने से पहले अपने सभी डेटा को ऋणात्मक संख्या में परिवर्तित कर दूं? – mawcsco

+0

हां। यह पाठ्यक्रम का सबसे अच्छा तरीका नहीं है, लेकिन इनवर्जन कार्यक्षमता के साथ चार्ट को विस्तारित करने के बाद बहुत तेज है। डेटा के प्रत्यक्ष अपडेट से बचने के लिए आप या तो 'XYChart.Data' कक्षा को इनवर्जन तर्क के साथ बढ़ा सकते हैं या एक उपयोगिता विधि पेश कर सकते हैं जो उलटा संख्याओं को चार्ट में जोड़ देगा। –

0

नहीं आसान विकल्प अक्ष पर inverse() आपरेशन सक्षम बनाना है। जेआरई कक्षाओं को पैच किए बिना यह काफी जटिल है।

कैसे दृष्टिकोण इस पर कुछ संकेत:

1) का विस्तार ValueAxis या एक्सिस (NumberAxis दुर्भाग्य से अंतिम)

2) अपने अक्ष वर्ग के लिए बूलियन क्षेत्र और inverse() विधि जोड़ने है

public void inverse() { 
    inversed = !inversed; // boolean property 
    invalidateRange(); 
    requestAxisLayout(); 
} 

3) यदि आप ValueAxis का विस्तार करते हैं - आपको सुपरक्लास द्वारा लागू ऑफ़सेट को क्षतिपूर्ति करने की आवश्यकता होगी (और उस कोड को अवरुद्ध करें जहां धुरी का आकार बदल रहा है)

@Override 
public Long getValueForDisplay(double displayPosition) { 
    if (inversed) 
     return super.getValueForDisplay(offset - displayPosition); 
    else 
     return super.getValueForDisplay(displayPosition); 
} 

@Override 
public double getDisplayPosition(Long value) { 
    if (inversed) 
     return offset - super.getDisplayPosition(value); 
    else 
     return super.getDisplayPosition(value); 
} 

4) (सबसे उग्र टुकड़ा) एक्सिस क्लास द्वारा दबाए गए लेबल टिक्स को अनदेखा करें - मूल कार्यान्वयन टिकों के डिफ़ॉल्ट क्रम पर निर्भर करता है। मुझे किसी अन्य तरीके से नहीं मिला जो इसे प्रतिबिंब के माध्यम से अनलॉक करता है। तो यह बहुत भंगुर है।

@Override 
protected void layoutChildren() { 
    final Side side = getSide(); 
    boolean isHorisontal = null == side || side.isHorizontal(); 
    this.offset = isHorisontal ? getWidth() : getHeight(); 
    super.layoutChildren(); 
    if (inversed) { 
     double prevEnd = isHorisontal ? offset + getTickLabelGap() : 0; 
     for (TickMark m : getTickMarks()) { 
      double position = m.getPosition(); 
      try { 
       final Text textNode = (Text) textNodeField.get(m); 
       final Bounds bounds = textNode.getLayoutBounds(); 
       if (0 <= position && position <= offset) 
        if (isHorisontal) { 
         textNode.setVisible(position < prevEnd); 
         prevEnd = position - (bounds.getWidth() + getTickLabelGap()); 
        } else { 
         textNode.setVisible(position > prevEnd); 
         prevEnd = position + (bounds.getHeight() + getTickLabelGap()); 
        } 
      } catch (IllegalAccessException ignored) { 
      } 
     } 
    } 
} 

वाई अक्ष इस उदाहरण this is how it looks like

0

उपयोग गुण lowerBound और upperBound अक्ष के में उलटा है। निचला बाउंड ऊपरी बाउंड से अधिक होना चाहिए। यहां बताया गया है कि आप fxml का उपयोग कैसे कर सकते हैं:

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 

<HBox   
    prefHeight="600.0" 
    prefWidth="800.0" 
    xmlns:fx="http://javafx.com/fxml/1">  

    <javafx.scene.chart.LineChart 
     fx:id="chart" > 
     <xAxis > 
      <javafx.scene.chart.NumberAxis 
       label="X Axis" 
       lowerBound="0.01" 
       upperBound="100" 
       tickUnit="10" 
       autoRanging="false" /> 
     </xAxis> 
     <yAxis> 
      <javafx.scene.chart.NumberAxis 
        label="Y Axis" 
        lowerBound="100" 
        upperBound="0.001" 
        tickUnit="10" 
        autoRanging="false" 
       /> 
     </yAxis> 
    </javafx.scene.chart.LineChart>    
</Hbox> 
संबंधित मुद्दे