ContourLabels tốt hơn cho ContourPlot
Khi tôi sử dụng ContourPlot, tôi thích sử dụng ContourLabels hơn là sử dụng PlotLeosystem. Tuy nhiên, các nhãn thường được hiển thị rất gần với khung nên đôi khi có thể khó đọc chúng.
Thí dụ:
ContourPlot[
Sin[x^2 + 2 y],
{x, 0, 2}, {y, 0, 2},
Contours -> 5,
ContourLabels -> True
]
Như bạn có thể thấy một số con số được đặt rất gần với các trục. Vì có đủ không gian trong cốt truyện để chúng có thể được đặt thay thế nên tôi muốn đặt chúng xa khung hình hơn một chút.
Có cách nào để đạt được điều này không? Hay tôi cần đặt các nhãn đó theo cách thủ công?
Trả lời
Clear["Global`*"]
f[x_, y_] = Sin[x^2 + 2 y];
cp = ContourPlot[
f[x, y], {x, 0, 2}, {y, 0, 2}, Contours -> 5];
Nhận các điểm dữ liệu được sử dụng cho các đường bao trong cp
data = Cases[cp, GraphicsComplex[data_List, __] :> data, Infinity][[1]];
Mỗi khi phần sau được thực hiện, nó sẽ chọn ngẫu nhiên một vị trí cho các nhãn (loại trừ các giá trị rất gần các cạnh). Nếu các nhãn vẫn quá gần với các cạnh hoặc các nhãn cho các đường viền liền kề chồng lên nhau, bạn có thể thực hiện lại để có được một vị trí khác.
Show[cp,
Epilog ->
{Text[Style[Round[f @@ #, 0.01] /. (0.) :> 0,
12, Bold], #] & /@
data[[Cases[cp, Line[pts__] :> RandomChoice[pts[[5 ;; -5]]], Infinity]]]}]
Vấn đề về vị trí của nhãn đường viền này ít nhất trở lại phiên bản 9. Một nhận xét mà tôi nhận được từ WRI vào năm 2014:
Vấn đề với ContourLabels là một vấn đề tồn tại, nó hiện đang được các nhà phát triển của chúng tôi giải quyết. Tôi hiểu rằng đây là một sự bất tiện và cách giải quyết mà bạn đã đề xuất cũng là một số thủ thuật mà chúng tôi khuyên người dùng nên làm để tránh các nhãn bị cắt bớt. Ngoài những cách giải quyết này, bạn có thể thử giá trị của ContourLabels là các hàm có dạng f [x, y, z], nghĩa là tạo nhãn tùy chỉnh. Xem trong phần Chi tiết của tài liệu:http://reference.wolfram.com/mathematica/ref/ContourLabels.html
Hai cách giải quyết được đề xuất là
- tăng PlotRangePadding, để cung cấp không gian xung quanh âm mưu cho các nhãn ở các cạnh, và
- định vị thủ công các nhãn ở cạnh bằng cách sử dụng tùy chọn ContourLabels với các chức năng, như WRI đề xuất