画像とグラフの重ね合わせ

73 次查看(过去 30 天)
iwashita
iwashita 2022-7-25
回答: Ezz1o 2023-3-3
添付画像に,graph.mで作成したグラフを重ねたいのですが,うまくいきません.
重ねる方法を教えていただけませんでしょうか.
figure
graph = imread('minusK_TF_horizon2.png');%画像%
imshow(graph);
hold on;
semilogx(freq,9*log(c0),'LineWidth',2);%重ねたいグラフ%
xlim([10^(-1) 10^2]),%x軸の範囲
yticks([-70 -60 -50 -40 -30 -20 -10 0 10 20 30])%y軸の範囲
xlabel('Freqency [Hz]');
ylabel('Gain [dB]');
h_axes = gca;
h_axes.FontSize = 10;
grid off;

采纳的回答

Hernia Baby
Hernia Baby 2022-7-26
image関数を使用することで解決可能です
img = imread('ngc6543a.jpg');
theta = linspace(0,4*pi,200);
image('CData',img,'XData',[4 8],'YData',[-1/4 1/4])
hold on
plot(theta,sin(theta)./theta,'LineWidth',3)
hold off

更多回答(2 个)

交感神経優位なあかべぇ
graph1.mを修正して、グラフが重なるようにしました。
imshowではなく、imageを使用し、axes内の画像を配置する場所を指定しました。
clear all;
freq = logspace(-1,2,100001);
s = 1i.*2.*pi.*freq;
%minus K model%
m = 48;
Q = 1.5;
wc = 2.*pi.*10;
w0 = 2.*pi.*0.5;
bunshi_Mdd = ((-1./((wc).^2)).*s.^2+((1i./Q)+1));
bunbo_Mdd = ((1./((w0).^2)).*s.^2+((1i./Q)+1));
Mdd = ((bunshi_Mdd)./(bunbo_Mdd));
a0 = angle(Mdd)*(180/pi);
b0 = unwrap(a0);%-360%
c0 = abs(Mdd);
%重ね書き%
figure
graph = imread('minusK_TF_horizon2.png');%画像%
% imshow(graph);
hold on;
semilogx(freq,9*log(c0),'LineWidth',2);%重ねたいグラフ%
xlim([10^(-1) 10^2]),%x軸の範囲
yticks([-70 -60 -50 -40 -30 -20 -10 0 10 20 30])%y軸の範囲
xlabel('Freqency [Hz]');
ylabel('Gain [dB]');
h_axes = gca;
h_axes.FontSize = 10;
grid off;
%追記-------------------
image(graph, 'XData', [10, 10^2], 'YData', [10,-40]);%YDataは、上下反転を防止するため、[大、小]の順番で記述

Ezz1o
Ezz1o 2023-3-3
Hello MATLAB Users,
久しぶりにMATLABを使う事になって hold on すら忘れていてGoogleしたら、このQnAに遭遇しました。
本質的な回答ができていないように見えるので、Googleでたどり着いた人向けに回答解説をつけておきたいと思います。
質問者の方は、664x219 の大きさの画像をimshowでfigureに均等に貼り付けています。
つまり、線形な横軸0:664、縦軸0:219 の座標軸に正方形のピクセルを形成して値(色)を入れているわけです。
その上に、自分の描きたいプロットを重ねようとしています。
横軸に入れたい freq は最小値0.01最大値100、縦軸 9*log(c0) は最小値-53.8332 最大値 5.2195 です。
横軸はともかくとして、縦軸はずいぶんと画像の縦軸より小さな範囲に値が入っています。
先に画像がimshowで書かれていますから、原点は画面左上になっています。
単にplotすると、画面左上に小さなグラフが重ね書きされるでしょう。
さらに、質問者の方は、semilogでグラフを描こうとしていますのでlogスケールになってさらに小さなグラフが重ね書きされます。
つまり、imshowで形成されたリニアな座標軸上に、軸範囲の全く異なるsemilogグラフを重ねてしまい、semilogグラフが意図した大きさよりもずいぶん小さくなってしまったようです。
この状況を質問者の方は「うまくいかない」と書かれています。
さて、この状況を解決するには3つの方法が考えられます(もう一個くらいあるかな?
一つは、回答者の人たちがやっているように、image関数をつかってsemilogで描きたいグラフ範囲に合わせて画像の割付を変更してしまう方法です。
もう一つは、逆に、画像の方のピクセルピッチ、つまり、1ピクセルに現実のいくつの値が割付られているのかを調べて、semilogで描くグラフの値を対応させる方法です。
最後に、gcaを使って、二つのグラフを一つのfigureの中にもたせてしまうこともできます(ちょっと高度です
いずれにしても、一つのaxesで二つの表示を重ねて作りたい場合、軸範囲はよく気を付けなければなりません。
回答を書いていたらaxesのことを思い出してきました。
HTH

标签

产品


版本

R2020b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!