理系が使ってもそれほど怒られないグラフをExcelで その3

*(Excel For Mac 2011で確認しています。書き方が古い場合があります。)*
この記事は「[理系が使ってもそれほど怒られないグラフをExcelで](http://qiita.com/mori_toma/items/7b053357539058e94975)」の第3弾です。
文中のマクロはすべて「散布図が選択状態であること」を前提に書いています。
詳しい使いかたは最初の記事をご覧ください。
 
前回は軸の名前などのパーツの設置、フォントの設定、マーカーの設定をしました。
ところで前回の記事で私はなぜ、フォントをよりによってCenturyにしてたんだろう。良い子は真似しないでください。
 
さて、今回はスケールや特殊な軸の設定をしたいと思います。
 
 
## 1 目盛りの設定
前回までのプログラムでは特に説明せず目盛りなしにしてました。
 
目盛りは外側(xlTickMarkOutside)、内側(xlTickMarkInside)、十字(xlTickMarkCross)、無し(xlTickMarkNone)の4つが選べます。

```
 .Axes(xlCategory).MajorTickMark = xlTickMarkOutside ' 横軸
.Axes(xlValue).MajorTickMark = xlTickMarkOutside ' 縦軸
```


太さと色

```
' 横軸 線の太さと色
.Axes(xlCategory).Format.Line.Weight = 2
.Axes(xlCategory).Format.Line.ForeColor.RGB = RGB(0, 0, 0)
    
' 縦軸 線の太さと色
.Axes(xlValue).Format.Line.Weight = 2
.Axes(xlValue).Format.Line.ForeColor.RGB = RGB(0, 0, 0)
```
 
軸の線のプロパティが目盛りにも適用されるようです。
 
## 2 内枠の設定
枠線も有無を選べますが、有りにするときは軸の線と同じ設定にしておくとトラブルが少ない気がします。別々の設定にしていると、枠線と軸が重なったときに予期しないデザインになることがあります。

```
.PlotArea.Format.Line.Style = msoLineSingle
.PlotArea.Format.Line.Visible = True
.PlotArea.Format.Line.Weight = 2
.PlotArea.Format.Line.ForeColor.RGB = RGB(0, 0, 0)
```
 
色々試したのですが、1行目でStyleを設定してから、2行目でVisibleの真偽を書くのが良いようです。というのも、この1行目がないと、枠線が存在していない場合に命令が無視されるからです。
 
## 3 スケールの設置
スケールは軸沿い(NextToAxis)、上部(High)、下部(Low)、無し(None)が選べます。

```
.Axes(xlCategory).TickLabelPosition = xlTickLabelPositionNextToAxis
.Axes(xlValue).TickLabelPosition = xlTickLabelPositionNextToAxis
```

上部はこんなのです。
<img width="474" alt="スクリーンショット 2017-02-17 14.59.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/26164/e742c02b-bb81-ce92-8567-b80bc4f255ee.png">

軸沿いと下部は何が違うかというと、こういうときに違ってきます。
 ・下部
<img width="482" alt="スクリーンショット" src="https://qiita-image-store.s3.amazonaws.com/0/26164/78703994-aefd-0b57-9357-3ae028e4f4a9.png">

・軸沿い
<img width="484" alt="スクリーンショット" src="https://qiita-image-store.s3.amazonaws.com/0/26164/043491d4-68d5-0aa0-a80f-d9564eebbf4b.png">

スケールと軸の距離も調節できます。0~1000%を設定できるらしいです。

```
.Axes(xlCategory).TickLabels.Offset = 100 ' 横軸
.Axes(xlValue).TickLabels.Offset = 100 ' 縦軸
```
 
文字を回転させることもできます。-90~90度を設定できるらしいです。

```
.Axes(xlCategory).TickLabels.Orientation = 0 ' 横軸
.Axes(xlValue).TickLabels.Orientation = 0 ' 縦軸
```
 
## 4 スケールの数値の設定
最大値、最小値、刻み幅を変えられます。
 

```
' 横軸
.Axes(xlCategory).MinimumScale = 0 ' 最小値
.Axes(xlCategory).MaximumScale = 8.1 ' 最大値
.Axes(xlCategory).MajorUnit = 2  ' 刻み
' 縦軸
.Axes(xlValue).MinimumScale = 0 ' 最小値
.Axes(xlValue).MaximumScale = 51 ' 最大値
.Axes(xlValue).MajorUnit = 10  ' 刻み
```

小数点以下の表示桁数を指定できます。

```
    .Axes(xlCategory).TickLabels.NumberFormat = "0.0" ' 横軸
    .Axes(xlValue).TickLabels.NumberFormat = "0.00" ' 縦軸
```
 
## 5 軸の設定を変える
交点を指定できます。

```
.Axes(xlCategory).CrossesAt = 0 ' 横軸の交点
.Axes(xlValue).CrossesAt = 0 ' 縦軸の交点
```

反転軸。数値が降順になります。

```
.Axes(xlCategory).ReversePlotOrder = True ' 横軸
.Axes(xlValue).ReversePlotOrder = True ' 縦軸
```

対数グラフにできます。

```
.Axes(xlCategory).ScaleType = xlScaleLogarithmic ' 横軸
.Axes(xlCategory).LogBase = 10 ' 対数の底 横軸
.Axes(xlValue).ScaleType = xlScaleLogarithmic ' 縦軸
.Axes(xlValue).LogBase = 10 ' 対数の底 縦軸
```
 
線形グラフに戻すとき

```
.Axes(xlCategory).ScaleType = xlScaleLinear ' 横軸
.Axes(xlValue).ScaleType = xlScaleLinear ' 縦軸
```

デフォルトは線形の軸なので、明示的に書くことは少ないかもしれません。
 
## 6 できた
色々まとめたマクロがこちら。紹介した機能以外にも、さりげなくマイナーチェンジしました。

```
Sub SimpleGraph3()
' 散布図を作成し、選択した状態で実行してください。
' 動作確認環境：Excel fo Mac 2011 散布図＞散布図（オプションなし）

With ActiveChart

    ' 外枠と内枠の位置です
    .ChartArea.Height = 480
    .ChartArea.Width = 480
    .PlotArea.Height = 380
    .PlotArea.Width = 380
    .PlotArea.Top = 50
    .PlotArea.Left = 50
    
    ' 背景色です
    .ChartArea.Format.Fill.ForeColor.RGB = RGB(255, 255, 255)
    .PlotArea.Format.Fill.ForeColor.RGB = RGB(255, 255, 255)
    
    ' 枠線
    .PlotArea.Format.Line.Style = msoLineSingle
    .PlotArea.Format.Line.Visible = True' Falseで線なしになります
    .PlotArea.Format.Line.Weight = 2
    .PlotArea.Format.Line.ForeColor.RGB = RGB(0, 0, 0)
    
    ' 目盛線（グリッド）
    .Axes(xlCategory).HasMajorGridlines = False
    .Axes(xlValue).HasMajorGridlines = False
    
    ' 目盛り xlTickMark*** : 末尾はInside, Outside, Cross, None
    .Axes(xlCategory).MajorTickMark = xlTickMarkOutside ' 横軸
    .Axes(xlValue).MajorTickMark = xlTickMarkOutside ' 縦軸
    
    ' 横軸 線の太さと色
    .Axes(xlCategory).Format.Line.Weight = 2
    .Axes(xlCategory).Format.Line.ForeColor.RGB = RGB(0, 0, 0)
    
    ' 縦軸 線の太さと色
    .Axes(xlValue).Format.Line.Weight = 2
    .Axes(xlValue).Format.Line.ForeColor.RGB = RGB(0, 0, 0)
    
' ----- 横軸のスケール -----'
    ' 種類 xlTickLabelPosition*** : 末尾はNextToAxis, High, Low, None
    .Axes(xlCategory).TickLabelPosition = xlTickLabelPositionLow
    
    .Axes(xlCategory).TickLabels.Offset = 100 ' 軸からの距離 0~1000 [%]
    .Axes(xlCategory).TickLabels.Orientation = 0 ' スケールの向き -90~90 [degree]
    
    .Axes(xlCategory).MinimumScale = 0 ' 最小値
    .Axes(xlCategory).MaximumScale = 8.1 ' 最大値
    .Axes(xlCategory).MajorUnit = 2  ' 刻み
    .Axes(xlCategory).TickLabels.NumberFormat = "0" ' 数値の表示形式  小数点以下の桁数を指定できます。

' ----- 縦軸のスケール -----'
    ' 種類 xlTickLabelPosition*** : 末尾はNextToAxis, High, Low, None
    .Axes(xlValue).TickLabelPosition = xlTickLabelPositionLow
    
    .Axes(xlValue).TickLabels.Offset = 100 ' 軸からの距離 0~1000 [%]
    .Axes(xlValue).TickLabels.Orientation = 0 ' スケールの向き -90~90 [degree]
    
    .Axes(xlValue).MinimumScale = 0 ' 最小値
    .Axes(xlValue).MaximumScale = 51 ' 最大値
    .Axes(xlValue).MajorUnit = 10  ' 刻み
    .Axes(xlValue).TickLabels.NumberFormat = "0" ' 数値の表示形式 小数点以下の桁数を指定できます。

' ----- 軸の交点 ----- '
    .Axes(xlCategory).CrossesAt = 0 ' 横軸の交点
    .Axes(xlValue).CrossesAt = 0 ' 縦軸の交点
    
' ----- 軸の反転 ----- '
    .Axes(xlCategory).ReversePlotOrder = False ' 横軸
    .Axes(xlValue).ReversePlotOrder = False ' 縦軸

' ----- 対数軸 ----- '
' 対数にするときは以下4行を使ってください
'    .Axes(xlCategory).ScaleType = xlScaleLogarithmic ' 横軸
'    .Axes(xlValue).ScaleType = xlScaleLogarithmic ' 縦軸
'    .Axes(xlCategory).LogBase = 10 ' 対数の底 横軸
'    .Axes(xlValue).LogBase = 10 ' 対数の底 縦軸
' 線形に戻したいときは以下2行を使ってください
'    .Axes(xlCategory).ScaleType = xlScaleLinear ' 横軸
'    .Axes(xlValue).ScaleType = xlScaleLinear ' 縦軸
' ----- ----- ----- ----- '
    
            
' ----- タイトル ----- '
    .HasTitle = True
    .ChartTitle.Text = "Title"
    .ChartTitle.Top = 450
    .ChartTitle.Left = 270

' ----- 横軸の名前 -----'
    .Axes(xlCategory).HasTitle = True
    .Axes(xlCategory).AxisTitle.Text = "yokojiku [mm]"
    .Axes(xlCategory).AxisTitle.Top = 430
    .Axes(xlCategory).AxisTitle.Left = 200

' ----- 縦軸の名前 -----'
    .Axes(xlValue).HasTitle = True
    .Axes(xlValue).AxisTitle.Text = "tatejiku [mm^2]"
    .Axes(xlValue).AxisTitle.Top = 160
    .Axes(xlValue).AxisTitle.Left = 20

' ----- 凡例 ----- '
    .HasLegend = True
    .SeriesCollection(1).Name = "Sub.1"  ' 系列が複数あるときはコピペして(2), (3), (4)...を作ってください
    .Legend.Top = 150
    .Legend.Left = 450

' ----- フォントとフォントサイズ ----- '
    .ChartTitle.Font.Name = "Century Schoolbook" ' タイトルのフォント
    .ChartTitle.Font.Size = 15 ' タイトルのフォントサイズ
    .Axes(xlCategory).AxisTitle.Font.Name = "Century Schoolbook" ' 横軸名のフォント
    .Axes(xlCategory).AxisTitle.Font.Size = 15 ' 横軸名のフォントサイズ
    .Axes(xlValue).AxisTitle.Font.Name = "Century Schoolbook" ' 縦軸名のフォント
    .Axes(xlValue).AxisTitle.Font.Size = 15 ' 縦軸名のフォントサイズ
    .Axes(xlCategory).TickLabels.Font.Name = "Times New Roman" ' 横軸スケールのフォント
    .Axes(xlCategory).TickLabels.Font.Size = 18 ' 横軸スケールのフォントサイズ
    .Axes(xlValue).TickLabels.Font.Name = "Times New Roman" ' 縦軸スケールのフォント
    .Axes(xlValue).TickLabels.Font.Size = 18 ' 縦軸スケールのフォントサイズ|
    .Legend.Font.Name = "Century Schoolbook" ' 凡例のフォント
    .Legend.Font.Size = 15 ' 凡例のフォントサイズ
    
    ' 太字が気になる場合はFalseにしてください。
    .Axes(xlCategory).AxisTitle.Font.Bold = True
    .Axes(xlValue).AxisTitle.Font.Bold = True
    
    
' ----- マーカー ----- '
    .SeriesCollection(1).MarkerSize = 5 ' サイズ 2~72
    .SeriesCollection(1).MarkerStyle = xlMarkerStyleCircle ' 形状
    ' --------------------------------------------------------------- '
    ' ----- .SeriesCollection(1).MarkerStyle = xlMarkerStyle*** ----------------- '
    ' ----- 末尾の***はCircle, Dash, Diamond, Dot, Plus, Square, Star, Triangle, X --- '
    ' ----- ただし、Dotはサイズを大きくできないかもしれません。---------------- '
    ' --------------------------------------------------------------- '
    .SeriesCollection(1).MarkerForegroundColor = RGB(0, 0, 0) ' マーカーの色
    .SeriesCollection(1).MarkerBackgroundColor = RGB(0, 0, 0) ' マーカーの内側の色
    .SeriesCollection(1).Format.Shadow.Style = msoShadowStyleInnerShadow '影を隠す
    .SeriesCollection(1).Format.Shadow.Visible = False '影を消す

    .HasTitle = False ' タイトルなしにできます。
'    .Axes(xlCategory).HasTitle = False ' 横軸名なしにできます。
'    .Axes(xlValue).HasTitle = False ' 縦軸名なしにできます。
    .HasLegend = False ' 凡例無しにできます。



End With

End Sub
```

実行前
<img width="360" alt="スクリーンショット" src="https://qiita-image-store.s3.amazonaws.com/0/26164/eda530af-8c0e-a600-bbfc-70f16de0bf49.png">

実行後
<img width="482" alt="スクリーンショット" src="https://qiita-image-store.s3.amazonaws.com/0/26164/c9860e17-6abd-5c8b-495f-717912ecb996.png">

今回は[伝わるデザイン](http://tsutawarudesign.web.fc2.com/kakkoyoku2.html)さんの「論文に使うような真面目なグラフ」を参考に設定してみました。「最大値」をキリのいい数より少しだけ大きくすると何となく爽やかになります。
 
## 7 今後の展望

* 近似曲線を追加
* エラーバーを追加
* プロットの値を表示
* 関数曲線を追加

などです。
 
先は長い