2012-03-23 4 views
6

मेरे पास चार्ट के साथ chart.png है जिसमें मैं कुछ लेबलिंग के साथ एक साधारण एक्स-वाई अक्ष डालना चाहता हूं। मैं जावा के साथ आने वाले किसी बाहरी सॉफ़्टवेयर का उपयोग न करने का भी प्रयास करना चाहता हूं। मुझे jfreechart का उपयोग करने की अनुमति है, लेकिन अगर इसे कुछ अच्छा बनाने के लिए कोई तरीका है, तो बस कुछ योजना जावा कोड का उपयोग करते हुए, यह बेहतर होगा। क्या किसी के पास इस तरह की चीज करने के बारे में अच्छा विचार है?जावा में एक .png फ़ाइल पर अक्ष कैसे रख सकता हूं?

अपडेट: कुछ ऐसा है लेकिन डेटा आरजीबी मूल्यों के साथ कोडित रंग होगा और निश्चित रूप से कोई धुरी/लेबलिंग नहीं होगी।

pyplot latency example http://www.goldb.org/goldblog/cmg_images/pylot_latency_sample.png

यह ग्राफ सिर्फ एक उदाहरण यह क्या मेरे वास्तविक रेखांकन की तरह ... मेरी असली रेखांकन उन में हर आरजीबी रंग मूल्य हो सकता है देखने के लिए ऐसा कुछ नहीं दिखता है। मैं जानता हूँ कि साजिश बनाने के लिए कैसे, मैं सिर्फ कैसे BufferImage कि मेरे द्वारा बनाए गए

+0

क्या आप 'png' से लिंक कर सकते हैं? क्या आपके पास मूल डेटा है? – trashgod

+0

इस तरह कुछ http://www.goldb.org/goldblog/cmg_images/pylot_latency_sample.png लेकिन यह एक पीएनजी – Grammin

+0

में नीले और सफेद बिंदु होंगे क्या आप वास्तव में मौजूदा छवि को बदलना चाहते हैं? क्या मौजूदा डेटा महत्वपूर्ण है? छवि के जैसा कोई नया चार्ट क्यों नहीं बनाते? – trashgod

उत्तर

14

मुझे नहीं लगता कि एक स्थिर छवि को संशोधित करना बहुत अच्छा काम करेगा, क्योंकि यह अनिवार्य रूप से पंजीकरण त्रुटियों और बेमेल शैलियों का नेतृत्व करेगा। इसके बजाय, चार्ट के निर्माण में किसी भी प्रतिपादन को एकीकृत करें। दृष्टिकोण का उपयोग here, sscce नीचे उल्लिखित आकार, रंग और अक्ष को वांछित के रूप में अनुकूलित करने के कुछ तरीकों को दिखाता है।

अनुपूरक: व्यक्तिगत वस्तुओं को रंगाने के लिए, एपीआई here दिखाए गए दृष्टिकोण की सिफारिश करता है, जिसमें एक कस्टम रेंडरर getItemPaint() ओवरराइड करता है। Color.getHSBColor() रंगों का एक पूर्ण स्पेक्ट्रम बनाने के लिए प्रयोग किया जाता है।

Response Time chart

यहाँ तुलना के लिए मूल, डिफ़ॉल्ट रेंडरर है:

Response Time chart

import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.Paint; 
import java.awt.Shape; 
import java.awt.geom.Ellipse2D; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 
import javax.swing.JFrame; 
import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.axis.ValueAxis; 
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; 
import org.jfree.data.xy.XYDataset; 
import org.jfree.data.xy.XYSeries; 
import org.jfree.data.xy.XYSeriesCollection; 

/** @see https://stackoverflow.com/q/9843451/230513 */ 
public class ResponseTime { 

    private static final int N = 600; 
    private static final String title = "ResponseTime"; 
    private static final Random random = new Random(); 
    private static final Shape circle = new Ellipse2D.Double(-3, -3, 6, 6); 
    private static final Color line = Color.gray; 

    private ChartPanel createPanel() { 
     JFreeChart chart = ChartFactory.createXYLineChart(
      title, "Elapsed Time (secs)", "Response Time (secs)", 
      createDataset(), PlotOrientation.VERTICAL, true, true, false); 
     XYPlot plot = chart.getXYPlot(); 
     MyRenderer renderer = new MyRenderer(true, true, N); 
     plot.setRenderer(renderer); 
     renderer.setSeriesShape(0, circle); 
     renderer.setSeriesPaint(0, line); 
     renderer.setUseFillPaint(true); 
     renderer.setSeriesShapesFilled(0, true); 
     renderer.setSeriesShapesVisible(0, true); 
     renderer.setUseOutlinePaint(true); 
     renderer.setSeriesOutlinePaint(0, line); 
     ValueAxis range = plot.getRangeAxis(); 
     range.setLowerBound(0.5); 
     return new ChartPanel(chart); 
    } 

    private static class MyRenderer extends XYLineAndShapeRenderer { 

     private List<Color> clut; 

     public MyRenderer(boolean lines, boolean shapes, int n) { 
      super(lines, shapes); 
      clut = new ArrayList<Color>(n); 
      for (int i = 0; i < n; i++) { 
       clut.add(Color.getHSBColor((float) i/n, 1, 1)); 
      } 
     } 

     @Override 
     public Paint getItemFillPaint(int row, int column) { 
      return clut.get(column); 
     } 
    } 

    private XYDataset createDataset() { 
     XYSeriesCollection result = new XYSeriesCollection(); 
     XYSeries series = new XYSeries("Series 1"); 
     for (double x = 0; x < N - 1; x++) { 
      series.add(x, f(x)); 
     } 
     series.add(25, 1.75); // outlier 
     result.addSeries(series); 
     return result; 
    } 

    private double f(double x) { 
     double y = 0.004 * x + .75; 
     return y + random.nextGaussian() * y/10; 
    } 

    private void display() { 
     JFrame f = new JFrame(title); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(createPanel()); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new ResponseTime().display(); 
      } 
     }); 
    } 
} 
+0

बहुत विस्तृत कोड उदाहरण के लिए धन्यवाद! मैं कुछ ऐसा करने के बारे में कैसे जाउंगा: यादृच्छिक आरजी = नया यादृच्छिक(); के लिए (डबल x = 0; x <600; x ++) {रंग रैंडकॉलर = नया रंग (rg.nextInt (255), rg.nextInt (255), rg.nextInt (255)); randomseries.add (x, f (एक्स), randColor.getRGB());} – Grammin

+0

मुझे लगता है कि मेरी मुख्य समस्या ग्राफ पर मेरे सही रंग मिल रही है? – Grammin

+0

महान उत्तर, वास्तव में – mKorbel

0

मैं एक BufferedImage में छवि पढ़ा था और उसके बाद छवि के पर drawXxxx() तरीकों का उपयोग पर अक्ष/लेबलिंग डाल करने के लिए पता नहीं है Graphics उदाहरण।

फिर या तो उस छवि को फ़ाइल में वापस लिखें या इसे कुछ गुई में प्रदर्शित करें।

+0

बनाया है, मेरे पास एक बुफर्ड इमेज में छवि है, लेकिन मुझे नहीं पता कि यह कितना मुश्किल होगा लेबल और रेंज/डोमेन लाइनों को निकालने के लिए – Grammin

0

जहां तक ​​मैं समझ सकता हूं, यह बहुत कठिन होगा। आपकी छवि तैयार होने के साथ, आप इसके शीर्ष पर कुछ और खींच सकते हैं, लेकिन आप छवि के अनुपात में इसे आनुपातिक बनाने के लिए इकाई की गणना कैसे करते हैं? बाद में पूरी छवि कैसे लेआउट करें? Jfreechart जैसे चार्टिंग टूल के साथ, आप लेबल, अक्ष और इकाइयों के साथ कितनी स्वतंत्रता खेलना चाहते हैं। लेकिन जब चार्ट वास्तव में बनाया गया है, तो उन्हें आकर्षित करने की बात आती है, चीजें बहुत जटिल हो जाएंगी। मुझे नहीं पता कि आप खुद को अक्ष क्यों आकर्षित करना चाहते हैं या आप वेब पर उन चार्ट को दिखाने जा रहे हैं या नहीं। मुझे jfreechart के साथ जेनरेट किए गए चार्ट मिलते थे कभी-कभी वेब पेजों पर बहुत अच्छा नहीं दिखता - टेक्स्ट दिखता है अस्पष्ट और फ़ॉन्ट रंग उसी पृष्ठ पर अन्य टेक्स्ट से मेल नहीं खाता है।

यदि आप उन्हें वेब पृष्ठों पर डालने जा रहे हैं, तो एक और विकल्प सर्वर से डेटा पुनर्प्राप्त करने के लिए जावास्क्रिप्ट का उपयोग करना होगा और क्लाइंट पक्ष पर फ्लाई पर चार्ट खींचता है।

3

मुझे लगता है कि jfreechart पुस्तकालय सही तरीके रिपोर्ट को लागू करता है।

लेकिन यदि आप किसी छवि पर कुछ लेबल खींचने के लिए कोड ढूंढ रहे हैं, तो यह है।

public static void main(String[] args) 
    throws IOException 
{ 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    frame.setLocationRelativeTo(null); 
    frame.setSize(800, 600); 

    BufferedImage modifiedImg = ImageIO.read(new File("c:\\test.png")); 
    Graphics graphics = modifiedImg.getGraphics(); 
    graphics.setColor(Color.red); 
    graphics.drawString("Label", 100, 100);// draw text 
    graphics.drawLine(1, 100, 100, 100);// draw line 

    JLabel label = new JLabel(); 
    label.setIcon(new ImageIcon(modifiedImg)); 
    frame.getContentPane().add(label, BorderLayout.CENTER); 

    frame.setVisible(true); 
} 

मैं jfreechart, हम Jide उपयोग कर रहे हैं का उपयोग नहीं करते, वे कुछ प्यारा चार्ट पुस्तकालय मिलता है। मुझे कीमत को छोड़कर इसे पसंद है, लेकिन बॉस ने इसे वैसे भी भुगतान किया। आप यहां स्क्रीनशॉट देख सकते हैं: http://www.jidesoft.com/products/charts.htm

संबंधित मुद्दे

 संबंधित मुद्दे