ContourLabels yang lebih baik untuk ContourPlot

Aug 30 2020

Saat saya menggunakan ContourPlot, saya lebih suka menggunakan ContourLabels daripada menggunakan PlotLegends. Namun label seringkali ditampilkan sangat dekat dengan bingkai sehingga terkadang sulit untuk membacanya.

Contoh:

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

Seperti yang Anda lihat, beberapa angka ditempatkan sangat dekat dengan sumbu. Karena ada cukup ruang di plot tempat mereka dapat ditempatkan, saya lebih suka menempatkannya sedikit lebih jauh dari bingkai.

Apakah ada cara untuk mencapai ini? Atau apakah saya perlu menempatkan label tersebut secara manual?

Jawaban

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];

Dapatkan titik data yang digunakan untuk kontur di cp

data = Cases[cp, GraphicsComplex[data_List, __] :> data, Infinity][[1]];

Setiap kali berikut ini dijalankan, ia akan memilih penempatan label secara acak (tidak termasuk nilai yang sangat dekat tepinya). Jika label masih terlalu dekat dengan tepi atau tumpang tindih dengan kontur yang berdekatan, Anda dapat mengeksekusi lagi untuk mendapatkan penempatan yang berbeda.

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

Masalah penempatan label kontur ini setidaknya kembali ke versi 9. Komentar yang saya terima dari WRI pada tahun 2014:

Masalah dengan ContourLabels adalah masalah yang sudah ada, saat ini sedang ditangani oleh pengembang kami. Saya memahami bahwa ini adalah ketidaknyamanan dan solusi yang Anda sarankan juga merupakan beberapa trik yang kami sarankan untuk dilakukan pengguna agar label tidak terpotong. Selain solusi ini Anda dapat mencoba nilai ContourLabels menjadi fungsi dari bentuk f [x, y, z], yaitu membuat label kustom. Lihat di bagian Detail dokumentasi:http://reference.wolfram.com/mathematica/ref/ContourLabels.html

Dua solusi yang disarankan adalah

  1. tambah PlotRangePadding, untuk memberi ruang di sekitar plot untuk label di tepinya, dan
  2. posisikan label secara manual di tepi menggunakan opsi ContourLabels dengan fungsi, seperti yang disarankan WRI