Groovyでグラフを作成する 3)日本語は使えるか?

添付のサンプルであるTimeSeriesChart.groovyを改良して、
地元の2010年9月の平均気温をグラフにしてみる。
データは、気象庁の過去の気象データ検索を使用した。

ソース

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



ChartBuilder builder = new ChartBuilder();

def chart = builder.timeserieschart(title:'2010年9月の平均気温',
    timeAxisLabel:'日付',
    valueAxisLabel:'気温(℃)',
    legend:true,
    tooltips:false,
    urls:false
) {
    timeSeriesCollection {
        timeSeries(name:'trades', 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)
        }
    }
}


def chartPanel = new ChartPanel(chart.chart, false);
chartPanel.setPreferredSize(new Dimension(0, 40));
chartPanel.setMouseZoomable(true, false);

builder.chartAsPNG(new FileOutputStream('.\\chart\\ChartSampleTemperature.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)

結果


ものの見事に化け化け( ̄~ ̄;)


同じことでハマってた人がいて、解決策があった。
GroovyChart と戯れて (3) : GroovyChart は日本語に対応してるのか?それはやってみなくちゃ分からない。

チャートを生成する前に ChartFactory.chartTheme を設定すればいいようだ。
以下を追加

 import org.jfree.chart.ChartFactory
 import org.jfree.chart.StandardChartTheme

 ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme())

改良ソース

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.data.time.Day
import org.jfree.chart.StandardChartTheme


ChartBuilder builder = new ChartBuilder();

def 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())
def chartPanel = new ChartPanel(chart.chart, false);
chartPanel.setPreferredSize(new Dimension(0, 40));
chartPanel.setMouseZoomable(true, false);

builder.chartAsPNG(new FileOutputStream('.\\chart\\ChartSampleTemperature.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)

結果

文字化けはしないようになった。(o^-')b
次は、日付が 日/月になってるのを日本での月/日にしたいな。