概要
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
ちょっと準備
Clear[tsize];
Table[{n,Null,tsize},{n,-10,10,1}]
とすると
{{-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のパラメーターの定義
重ねる2つのグラフに共通するパラメータを作っておく。ticx, ticy はrangeより多い適当な数。
tsizeは、目盛を軸の両側に出すために{0.01,0.01}
にした。片側なら{0.01,0}
とか。単に0.01
とすると、Mathematicaのversionで違う結果になった。
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
を入れればいいことに気付くまで、2つのグラフの大きさが合わずに迷走した...
ImagePadding->0
にすると、Frameの線が見えなかったりするので、1。Frameに数字を振るなら、ImagePadding->30
等とする。ただし、axesとframeで揃えるためにipaddingという変数にしている。
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]
出力は
FrameにTicksを付けたものを描く
Insetは、合わせたい座標を並べて書く。左下に合わせる必要はないので、Inset[axes,{0,0},{0,0}]
でも可。Fig in Figのようにずらしたいときは、この2の座標をずらす。
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]]
出力は
グラフを描く
別途、本来のグラフを作成。crossは自分で定義したマーカー。(下記参照)
Table[{n,n},{n,-3,3}];
g = ListPlot[%,PlotMarkers->{cross,0.05}]
そして、frameと一緒に見せる。Showの引数で最初にframeを置かないと、苦労が活かされない。
Show[frame,g]
普通のPlotでもOK.
g = Plot[2Sin[x],{x,-Pi,Pi}];
Show[frame, g, PlotLabel->Style[2 Sin[x],Bold,18]]
ListPlotのマーカー定義
ListPlotのマーカーを定義する。Open symbolsのcirc, cross, square, triangle。Fillのdisc.
Thin、Thickで指定しないのは、太さが気に入らなかっただけ。
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がずれる...ズレなくなる方法をどなたか教えていただけると有り難いです。
参考サイト
ここのコードやメモを参考にしました。
そしてWolframのドキュメント
Wolfram Research (2007), ImagePadding, Wolfram言語関数,