LoginSignup
1
0

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

Last updated at Posted at 2023-08-25

概要

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言語関数,

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0