How to create a quiver plot with logarithmic scaled arrows
24 ビュー (過去 30 日間)
古いコメントを表示
Hey, I have a vector field with a large dynamic range; therefore the only way to properly see it in a quiver plot is if the length of the vectors will scale logarithmic instead of linearly.
As far as I know, there is no built in way to do it. Manually take the log before calling quiver will not work as it will change the angles, and therefore the quiver plot will be wrong.
I tried searching online but couldn't a way to do it, anyone knows one?
Another option is starting with the matlab built in quiver plot code and manually making another function that fixes it, is there anyway to get it?
2 件のコメント
Chad Greene
2016 年 3 月 7 日
Interesting problem. The code for quiver is viewable. Type
open quiver
and it should be relatively painless to manually hack the length scaling.
採用された回答
Star Strider
2016 年 3 月 7 日
I’m not certain what you’re plotting, so I’m guessing here.
This is one approach:
t = linspace(1E-3, 6*pi);
x = t .* cos(t) + 2;
y = t.* sin(t) + 2;
dx = gradient(x);
dy = gradient(y);
figure(1)
quiver(x, y, dx, dy) % Retain Scaling
grid
axis equal
log_dx = log(hypot(dx,dy)) .* (dx);
log_dy = log(hypot(dx,dy)) .* (dy);
figure(2)
quiver(x, y, log_dx, log_dy, 0) % Log Arrows, No Scaling
grid
axis equal
6 件のコメント
その他の回答 (1 件)
Angelo Hafner
2019 年 3 月 15 日
編集済み: Angelo Hafner
2019 年 3 月 15 日
Just enter the u,v,w components in the function log_cv... The function returns the log components of the vector [u,v,w]...
function [log_ax,log_ay,log_az] = log_cv(u,v,w)
r = sqrt(u.^2 + v.^2 + w.^2);
rho = sqrt(u.^2 + v.^2);
t = atan2(rho,w);
f = atan2(v,u);
log_ax = log10(r) .* sin(t) .* cos(f);
log_ay = log10(r) .* sin(t) .* sin(f);
log_az = log10(r) .* cos(t);
end
参考
カテゴリ
Help Center および File Exchange で Vector Fields についてさらに検索
製品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!