ContourPlotのより良いContourLabels
ContourPlotを使用するときは、PlotLegendsを使用するよりもContourLabelsを使用する方が好きです。ただし、ラベルはフレームの非常に近くに表示されることが多いため、読みにくい場合があります。
例:
ContourPlot[
Sin[x^2 + 2 y],
{x, 0, 2}, {y, 0, 2},
Contours -> 5,
ContourLabels -> True
]
ご覧のとおり、いくつかの数値は軸の非常に近くに配置されています。代わりに配置できる十分なスペースがプロットにあるので、フレームから少し離して配置したいと思います。
これを達成する方法はありますか?または、これらのラベルを手動で配置する必要がありますか?
回答
Clear["Global`*"]
f[x_, y_] = Sin[x^2 + 2 y];
cp = ContourPlot[
f[x, y], {x, 0, 2}, {y, 0, 2}, Contours -> 5];
の等高線に使用されるデータポイントを取得します cp
data = Cases[cp, GraphicsComplex[data_List, __] :> data, Infinity][[1]];
以下が実行されるたびに、ラベルの配置がランダムに選択されます(エッジに非常に近い値を除く)。それでもラベルがエッジに近すぎる場合、または隣接する輪郭のラベルが重なっている場合は、もう一度実行して別の配置を取得できます。
Show[cp,
Epilog ->
{Text[Style[Round[f @@ #, 0.01] /. (0.) :> 0,
12, Bold], #] & /@
data[[Cases[cp, Line[pts__] :> RandomChoice[pts[[5 ;; -5]]], Infinity]]]}]
等高線ラベルのこの配置の問題は、少なくともバージョン9にまでさかのぼります。2014年にWRIから受け取ったコメント:
ContourLabelsの問題は既存のものであり、現在開発者が取り組んでいます。これは不便であり、提案された回避策は、ラベルが切り捨てられないようにするためにユーザーに推奨するトリックの一部でもあることを理解しています。これらの回避策以外に、ContourLabelsの値をf [x、y、z]の形式の関数にすること、つまりカスタムラベルを作成することを試みることができます。ドキュメントの詳細セクションを参照してください。http://reference.wolfram.com/mathematica/ref/ContourLabels.html
提案された2つの回避策は次のとおりです。
- PlotRangePaddingを増やして、プロットの周囲にエッジのラベル用のスペースを与えます。
- WRIが提案したように、関数でContourLabelsオプションを使用して、ラベルをエッジに手動で配置します