ContourPlotのより良いContourLabels

Aug 30 2020

ContourPlotを使用するときは、PlotLegendsを使用するよりもContourLabelsを使用する方が好きです。ただし、ラベルはフレームの非常に近くに表示されることが多いため、読みにくい場合があります。

例:

 ContourPlot[
    Sin[x^2 + 2 y],
    {x, 0, 2}, {y, 0, 2},
    Contours -> 5,
    ContourLabels -> True
 ]

ご覧のとおり、いくつかの数値は軸の非常に近くに配置されています。代わりに配置できる十分なスペースがプロットにあるので、フレームから少し離して配置したいと思います。

これを達成する方法はありますか?または、これらのラベルを手動で配置する必要がありますか?

回答

2 BobHanlon Aug 30 2020 at 22:36
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]]]}]

1 tad Aug 31 2020 at 00:46

等高線ラベルのこの配置の問題は、少なくともバージョン9にまでさかのぼります。2014年にWRIから受け取ったコメント:

ContourLabelsの問題は既存のものであり、現在開発者が取り組んでいます。これは不便であり、提案された回避策は、ラベルが切り捨てられないようにするためにユーザーに推奨するトリックの一部でもあることを理解しています。これらの回避策以外に、ContourLabelsの値をf [x、y、z]の形式の関数にすること、つまりカスタムラベルを作成することを試みることができます。ドキュメントの詳細セクションを参照してください。http://reference.wolfram.com/mathematica/ref/ContourLabels.html

提案された2つの回避策は次のとおりです。

  1. PlotRangePaddingを増やして、プロットの周囲にエッジのラベル用のスペースを与えます。
  2. WRIが提案したように、関数でContourLabelsオプションを使用して、ラベルをエッジに手動で配置します