2016-06-27 74 views
1

私はJFreeChartを使用して、イメージとしてエクスポートされ、自動的に生成されたドキュメントに埋め込まれた折れ線グラフを作成しています。私は値を表示するために使用しているコードは次のようになりラベル値とエラーバーをJFreeChart折れ線グラフに追加するにはどうすればいいですか?

simple line plot

::私もにエラーバーを追加したい

LineAndShapeRenderer renderer = new LineAndShapeRenderer(true, false); 
chart.getCategoryPlot().setRenderer(renderer); 
renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator("{2}", NumberFormat.getNumberInstance())); 
renderer.setBaseItemLabelsVisible(true); 

例えば1の単純な折れ線グラフは次のようになります。各ポイントの標準偏差を表示するには、StatisticalLineAndShapeRendererを使用して(もちろんデータセットにエラー値を追加して)これを行うことができます。

StatisticalLineAndShapeRenderer renderer = new StatisticalLineAndShapeRenderer(true, false); 
chart.getCategoryPlot().setRenderer(renderer); 
renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator("{2}", NumberFormat.getNumberInstance())); 
renderer.setBaseItemLabelsVisible(true); 

このコードでは、グラフにエラーバーが表示されますが、ラベルは消えています。それがこの画像で見ることができるように:

line plot with error bars

私はエラーバーとラベルの両方を備えたオンラインの例を見つけることを試みたが、私はそうしなかったしました。 Statustical Rendererを使用しているときにラベルが消えてしまう理由は何ですか?

EDIT:最小限の自己完結型の例を追加しました。

DefaultStatisticalCategoryDataset dataset = new DefaultStatisticalCategoryDataset(); 
dataset.add(1, 0.1, "serie", "A"); 
dataset.add(2, 0.4, "serie", "B"); 
dataset.add(2, 0.2, "serie", "C"); 

JFreeChart chart = ChartFactory.createLineChart("Chart", null, null, dataset, PlotOrientation.VERTICAL, false, true, true); 
LineAndShapeRenderer renderer = new LineAndShapeRenderer(true, false); 
chart.getCategoryPlot().setRenderer(renderer); 
renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator("{2}", NumberFormat.getNumberInstance())); 
renderer.setBaseItemLabelsVisible(true); 

JFreeChart chartErrorBars = ChartFactory.createLineChart("ErrorBars", null, null, dataset, PlotOrientation.VERTICAL, false, true, true); 
StatisticalLineAndShapeRenderer statisticalRenderer = new StatisticalLineAndShapeRenderer(true, false); 
chartErrorBars.getCategoryPlot().setRenderer(statisticalRenderer); 
statisticalRenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator("{2}", NumberFormat.getNumberInstance())); 
statisticalRenderer.setBaseItemLabelsVisible(true); 

int width = 1500; 
int height = 400; 

try { 
    FileOutputStream fos = new FileOutputStream(new File("chart.png")); 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    ChartUtilities.writeChartAsPNG(baos, chart, width, height); 
    baos.writeTo(fos); 
    baos.close(); 
    fos.close(); 

    fos = new FileOutputStream(new File("chartErrorBars.png")); 
    baos = new ByteArrayOutputStream(); 
    ChartUtilities.writeChartAsPNG(baos, chartErrorBars, width, height); 
    baos.writeTo(fos); 
    baos.close(); 
    fos.close(); 

} catch (IOException e) { 
    e.printStackTrace(); 
} 

そして、そのコードによって生成された2つの画像。

simple Example with ValuesSimple Example with Error Bars

+0

あなたの現在のアプローチを示している[MCVE]が含まれるようにあなたの質問を編集してください。 – trashgod

+0

@trashgod私は例を追加しました。他に何か追加すればいいですか? – Julian

+0

私は以下のアプローチを提案しました。 – trashgod

答えて

1

StatisticalLineAndShapeRenderer表示ラベルtruegetItemShapeVisible()を返す親LineAndShapeRenderer方法。下の例では、チャートファクトリーを避け、図形と線の両方を有効にする明示的なStatisticalLineAndShapeRendererコンストラクタを使用しました。

StatisticalLineAndShapeRenderer renderer 
     = new StatisticalLineAndShapeRenderer(true, true); 

ChartFactoryを回避するための具体的な理由はありますか?

ChartFactoryを再利用しながら、それはordering chicken on toast, hold the chicken, to get toastを彷彿とさせるだ、好都合です。より批判的には、​​3210 LineAndShapeRendererは、おそらく将来のメンテナーを困惑させる要求されたツールチップとURLジェネレータを必要とします。

形状を無効にする方法はありますか?

suggestのように、空のShapeが有効です。

renderer.setSeriesShape(0, new Rectangle2D.Double(0, 0, 0, 0)); 

image

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.text.NumberFormat; 
import javax.swing.JFrame; 
import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.StandardChartTheme; 
import org.jfree.chart.axis.CategoryAxis; 
import org.jfree.chart.axis.NumberAxis; 
import org.jfree.chart.axis.ValueAxis; 
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator; 
import org.jfree.chart.plot.CategoryPlot; 
import org.jfree.chart.renderer.category.StatisticalLineAndShapeRenderer; 
import org.jfree.data.statistics.DefaultStatisticalCategoryDataset; 

/** 
* @see https://stackoverflow.com/a/38080778/230513 
*/ 
public class Test { 

    private void display() { 
     JFrame f = new JFrame("Test"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     DefaultStatisticalCategoryDataset dataset 
      = new DefaultStatisticalCategoryDataset(); 
     dataset.add(1, 0.1, "series", "A"); 
     dataset.add(2, 0.4, "series", "B"); 
     dataset.add(2, 0.2, "series", "C"); 

     CategoryAxis domain = new CategoryAxis(); 
     ValueAxis range = new NumberAxis(); 
     StatisticalLineAndShapeRenderer renderer 
      = new StatisticalLineAndShapeRenderer(true, true); 
     CategoryPlot plot = new CategoryPlot(dataset, domain, range, renderer); 
     JFreeChart chart = new JFreeChart(
      "ErrorBars", JFreeChart.DEFAULT_TITLE_FONT, plot, false); 
     renderer.setBaseItemLabelGenerator(
      new StandardCategoryItemLabelGenerator("{2}", 
       NumberFormat.getNumberInstance())); 
     renderer.setBaseItemLabelsVisible(true); 
     renderer.setSeriesShape(0, new Rectangle2D.Double(0, 0, 0, 0)); 
     new StandardChartTheme("JFree").apply(chart); 
     f.add(new ChartPanel(chart) { 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(600, 300); 
      } 
     }); 

     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Test()::display); 
    } 
} 
+0

StatisticalLineAndShapeRendererのシェイプを有効にすることを提案したときにテストしましたが、既にラベルが有効になっています。 ChartFactoryを避ける特別な理由はありますか?私はこれが私の質問を解決すると信じていますが、形状を無効にする方法はありますか?あるいは、サイズを変更するだけです。 'statisticalRenderer.setSeriesShape(0、new Ellipse2D.Double(0、0、0、0));' – Julian

関連する問題