Rubyからxlsxを出力するためのライブラリとして、randym/axlsxがあります。これはグラフ描画にも使える…のですが、2箇所ほどハマりました。
余計なもの(次元)がついてくる
axlsxで作れるグラフは、以下の種類があります。
-
AreaChart
…面グラフ -
BarChart
…棒グラフ -
Bar3DChart
…3D棒グラフ -
BubbleChart
…バブルチャート -
LineChart
…折れ線グラフ -
Pie3DChart
…3D円グラフ -
ScatterChart
…散布図
となっていて、どういうわけか円グラフが3Dのしかありません。3D円グラフの利点は目の錯覚を活かせることぐらいしかないので、まっとうな用途ではできれば使いたくありません。
どうしようかと調べていたところ、rot_x: 90
と指定することで90度回転させて、真上を表示するようにするという、コロンブスの卵的、あるいは富豪的な解決法がありました。
順番が合わない
どうにか円グラフも作れるようになったところで、今度は棒グラフを作っていたのですが、予想外なことになりました。
wb.add_worksheet(name: '棒グラフ') do |sheet|
sheet.add_row ['a', 1]
sheet.add_row ['b', 2]
sheet.add_row ['c', 3]
sheet.add_row ['d', 4]
sheet.add_chart(Axlsx::BarChart, start_at: 'A5', end_at: 'F17') do |chart|
chart.add_series data: sheet['B1:B4'], labels: sheet['A1:A4']
end
end
これで棒グラフはできたのですが、表の方の並びが上からa、b、c、dの順なのに対して、グラフの方はその逆順に並んでしまっているのです。どうすればいいのかわからず、Excelで変更して保存を行い、出来上がったxlsxを解凍してxmlを比較した結果、どこを調整すればいいかが判明しました。
sheet.add_chart(Axlsx::BarChart, start_at: 'A5', end_at: 'F17') do |chart|
chart.add_series data: sheet['B1:B4'], labels: sheet['A1:A4']
chart.cat_axis.scaling.orientation = :maxMin
end
うーん、わからない!