読者です 読者をやめる 読者になる 読者になる

Groovyでグラフを作成する 4)日付表示を“日-月”から“月/日”に変更する リベンジ編

groovy

ローソクチャートだがJava+JFreeChartの場合はsetDateFormatOverrideメソッドで
日付の形式ができるようだ。
groovyとJFreeChartでローソク足グラフで取引量を非表示にする

jfc = ChartFactory.createCandlestickChart(
  "株価推移",
  "日付",
  "株価",
  dohlcds,
  false)

// 時間のフォーマット
jfc.getPlot().getDomainAxis().setDateFormatOverride(
  new java.text.SimpleDateFormat("MM/dd")
)

JFreeChartを直接ではなく、buidlerを使用してるので、
その辺のクラスを確認する。

builderで作成したクラスは何?
println chart.getClass()
class com.thecoderscorner.groovychart.chart.TimeseriesChart

これだとだめだな。

ChartPanelの第一パラメータで指定しているクラスは?
println chart.chart.getClass()
class org.jfree.chart.JFreeChart

おっ、ここからいけそうだ。

getPlot()して取得できるクラスは?
println chart.chart.getPlot().getClass()
class org.jfree.chart.plot.XYPlot

getDomainAxisメソッドもあるな。

getDomainAxis()して取得できるクラスは?
println chart.chart.getPlot().getDomainAxis().getClass()
class org.jfree.chart.axis.DateAxis

setDateFormatOverride
メソッドを持ってる。

setDateFormatOverride(java.text.DateFormat formatter)
Sets the date format override.


これでいけそうだ。


ソース

import com.thecoderscorner.groovychart.chart.ChartBuilder
import groovy.swing.SwingBuilder
import java.awt.BorderLayout
import java.awt.Dimension
import org.jfree.chart.ChartFactory
import org.jfree.chart.ChartPanel
import org.jfree.chart.JFreeChart;
import org.jfree.data.time.Day
import org.jfree.chart.StandardChartTheme


ChartBuilder builder = new ChartBuilder();



chart = builder.timeserieschart(title:'2010年9月の平均気温',
    timeAxisLabel:'日付',
    valueAxisLabel:'気温(℃)',
    legend:true,
    tooltips:false,
    urls:false
) {
    timeSeriesCollection {
        timeSeries(name:'気温', timePeriodClass:'org.jfree.data.time.Day') {
            add(period:new Day(1,9,2010), value:27.4)
            add(period:new Day(2,9,2010), value:27.5)
            add(period:new Day(3,9,2010), value:29.1)
            add(period:new Day(4,9,2010), value:28.7)
            add(period:new Day(5,9,2010), value:27.9)
            add(period:new Day(6,9,2010), value:29.3)
            add(period:new Day(7,9,2010), value:29.2)
            add(period:new Day(8,9,2010), value:25.3)
            add(period:new Day(9,9,2010), value:24.4)
            add(period:new Day(10,9,2010), value:24.1)
            add(period:new Day(11,9,2010), value:27.7)
            add(period:new Day(12,9,2010), value:27.9)
            add(period:new Day(13,9,2010), value:29.5)
            add(period:new Day(14,9,2010), value:25.1)
            add(period:new Day(15,9,2010), value:22.3)
            add(period:new Day(16,9,2010), value:20.9)
            add(period:new Day(17,9,2010), value:22.7)
            add(period:new Day(18,9,2010), value:24.2)
            add(period:new Day(19,9,2010), value:24.5)
            add(period:new Day(20,9,2010), value:24.8)
            add(period:new Day(21,9,2010), value:25.5)
            add(period:new Day(22,9,2010), value:28.3)
            add(period:new Day(23,9,2010), value:21.2)
            add(period:new Day(24,9,2010), value:18.5)
            add(period:new Day(25,9,2010), value:19.9)
            add(period:new Day(26,9,2010), value:18.9)
            add(period:new Day(27,9,2010), value:18.0)
            add(period:new Day(28,9,2010), value:19.7)
            add(period:new Day(29,9,2010), value:21.7)
            add(period:new Day(30,9,2010), value:19.4)
        }
    }

}

ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme())

chart.chart.getPlot().getDomainAxis().setDateFormatOverride( new java.text.SimpleDateFormat("MM/dd"))
def chartPanel = new ChartPanel(chart.chart, false);
chartPanel.setPreferredSize(new Dimension(0, 40));
chartPanel.setMouseZoomable(true, false);

builder.chartAsPNG(new FileOutputStream('.\\chart\\ChartSampleTemperature5.png'), 800, 400);

SwingBuilder swing = new SwingBuilder();
def frame = swing.frame(
            title:'This is a Frame',
            location:[100,100],
            size:[800,400],
            defaultCloseOperation:javax.swing.WindowConstants.EXIT_ON_CLOSE);

frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add( chartPanel, java.awt.BorderLayout.CENTER);
frame.setVisible(true)

結果

[D:\workspace\groovy_SandBox]groovy ChartSampleTemperature5.groovy
[D:\workspace\groovy_SandBox]


よし成功!!