Mathematica でFrameとAxesの両方にTicksを付ける

## 概要
MathematicaのPlotは、FrameをTrueにすると、Axesが消える。
両方表示するのにいつも苦労するので、そして、やり方を忘れるので、備忘録。

* Axesを入れたグラフを作り、Frameを入れたグラフにEpilog Insetで入れる。
* 別途、描きたいグラフを作成、Showで一緒に見せる。

## 環境
試したのは、
Mathematica v.12.0.0.0
Mathematica Wolfram Cloud Version 1.66.0.2 (July 28, 2023)
だけ。でも、特段新しいものは使っていないので、多分どのVersionでも使えるはず。

## Mathematica code


### ちょっと準備

```wl
Clear[tsize];
Table[{n,Null,tsize},{n,-10,10,1}]
```
とすると
```wl
{{-10,Null,tsize},{-9,Null,tsize},{-8,Null,tsize},{-7,Null,tsize},{-6,Null,tsize},{-5,Null,tsize},{-4,Null,tsize},{-3,Null,tsize},{-2,Null,tsize},{-1,Null,tsize},{0,Null,tsize},{1,Null,tsize},{2,Null,tsize},{3,Null,tsize},{4,Null,tsize},{5,Null,tsize},{6,Null,tsize},{7,Null,tsize},{8,Null,tsize},{9,Null,tsize},{10,Null,tsize}}
```
というoutputが出て来る。あとで使うので作っておくと楽。

### Graph Optionのパラメーターの定義

重ねる２つのグラフに共通するパラメータを作っておく。ticx, ticy はrangeより多い適当な数。
tsizeは、目盛を軸の両側に出すために`{0.01,0.01}`にした。片側なら`{0.01,0}`とか。単に`0.01`とすると、Mathematicaのversionで違う結果になった。

```wl
range = {{-5,5},{-4,4}};
leftbottom = {-5,-4};
ticx = Table[{n,Null},{n,-10,10,1}];
ticy = Table[{n,Null},{n,-10,10,1}];
style = Directive[Black,AbsoluteThickness[1]];
aratio = 4/5;
ipadding=1;
isize = 300;
tsize = {0.01,0.01};
```

### AxesにTicksを入れたものを描く

最初の`{{Null,Null}}`は、実際には点を置かないための仮置き。
ここで上で用意したTicksのListを使う。端まで数字を入れると出力例のように数字が切れるので、実際には消しておく。

`ImagePadding->1`を入れればいいことに気付くまで、２つのグラフの大きさが合わずに迷走した...
`ImagePadding->0`にすると、Frameの線が見えなかったりするので、1。Frameに数字を振るなら、`ImagePadding->30`等とする。ただし、axesとframeで揃えるためにipaddingという変数にしている。

```wl
axes = ListPlot[{{Null,Null}},
PlotRange->range,
Axes->True, AxesStyle->style,
BaseStyle->{Black,FontFamily->"Helvetica",FontSize->18},
Ticks->{{{-2,"-2",tsize},{-3,"-3",tsize},{-4,"-4",tsize},{-5,Null,tsize},{-1,Null,tsize},0,{1,☆,tsize},{2,弐,tsize},{3,"3",tsize},{4,"4",tsize}},{{-5,Null,tsize},{-4,"-4",tsize},{-3,"-3",tsize},{-2,Null,tsize},{-1,Null,tsize},{1,Null,tsize},2,Pi,{4,Null,tsize},{5,Null,tsize}}},
GridLines->None,
PlotRangePadding->0,
ImagePadding->ipadding,
AspectRatio->aratio,
ImageSize->isize]
```
出力は

<!--![20230826-1.png]-->
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535109/bfd5ecb1-e1cf-b2ee-c9a7-04b2bb55141f.png">

### FrameにTicksを付けたものを描く

Insetは、合わせたい座標を並べて書く。左下に合わせる必要はないので、`Inset[axes,{0,0},{0,0}]`でも可。Fig in Figのようにずらしたいときは、この2の座標をずらす。

```wl
frame =ListPlot[{{Null,Null}},
PlotRange->range,
Frame->True,
FrameTicks->{{ticy, ticy}, {ticx, ticx}},
FrameStyle->style,
GridLines->None,
PlotRangePadding->0,
ImagePadding->ipadding,
ImageSize->isize,
AspectRatio->aratio,
Epilog->Inset[axes,leftbottom,leftbottom]]
```

出力は

<!--![20230826-2.png]-->
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535109/2c0789ff-4209-d3d5-9b3c-2fa25ce62e05.png">


### グラフを描く

別途、本来のグラフを作成。crossは自分で定義したマーカー。（下記参照）

```wl
Table[{n,n},{n,-3,3}];
g = ListPlot[%,PlotMarkers->{cross,0.05}]
```

<!--![20230826-3.png]-->
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535109/4a30dcfc-a5db-c138-6bc4-f252eef62f4d.png">


そして、frameと一緒に見せる。Showの引数で最初にframeを置かないと、苦労が活かされない。

```wl
Show[frame,g]
```
<!--![20230826-4.png]-->
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535109/8de6c1e5-116d-c6c4-a4d1-2c818dc2e913.png">

普通のPlotでもOK.

```wl
g = Plot[2Sin[x],{x,-Pi,Pi}];
Show[frame, g, PlotLabel->Style[2 Sin[x],Bold,18]]
```
<!--![20230826-5.png]-->
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535109/dd367ef7-cc8d-7d5c-6f19-9de19eae4851.png">


### ListPlotのマーカー定義
ListPlotのマーカーを定義する。Open symbolsのcirc, cross, square, triangle。Fillのdisc.
Thin、Thickで指定しないのは、太さが気に入らなかっただけ。

```wl
circ = Graphics[{Directive[Blue,AbsoluteThickness[1]],Circle[]}];
disc = Graphics[{Red,Thick,Disk[]}];
cross = Graphics[{{Directive[Black,AbsoluteThickness[1]],Line[{{-1,-1},{1,1}}]},{Directive[Black,AbsoluteThickness[1]],Line[{{-1,1},{1,-1}}]}}];
square = Graphics[{EdgeForm[Directive[Blue,AbsoluteThickness[1]]],White,RegularPolygon[4]}];
triangle = Graphics[{EdgeForm[Directive[Red,AbsoluteThickness[1]]],White,RegularPolygon[3]}];
```

### その他

* 最初に`SetDirectory["/Users/qiita/test"]`
として、Showの後で
`Export["fig1.pdf",%,"PDF"]`
としておくと、/Users/qiita/testにfig1.pdfが自動（上書き）生成される。解像度は高くはないので、始めからグラフを大きくしておいた。
どちらかというと、画面拡大からキャプチャのほうが綺麗かも。
* この後 Keynote にpdfを読み込んで文字を入れるので、題などは入れていない。
* たぶん、Onlineの出力は 1 pixel くらいずれていると思う。線の幅の端に座標が合っているよう。だから、axesの端のtickが見えてしまうので、端のtickを描かないという対処をしている。気にしないという対処でもいいかもしれない。
* 出来たグラフの大きさをマウスで変えるとaxisとframeがずれる...ズレなくなる方法をどなたか教えていただけると有り難いです。


## 参考サイト

ここのコードやメモを参考にしました。

https://mathematica.stackexchange.com/questions/94726/plotting-an-additional-axis-with-ticks

そしてWolframのドキュメント
Wolfram Research (2007), ImagePadding, Wolfram言語関数， 

https://reference.wolfram.com/language/ref/ImagePadding.html.ja