رسم کانتور در متلب
به نام خدا و سلام.
به جلسه بیست و ششم از سری جلسات آموزش متلب خوش آمدید. آموزش متلب از وبسایت متلبپلاس به صورت رایگان ارائه میشود. از جلسه بیست و یکم شروع به آموزش انواع مختلف نمودار در متلب کردهایم. در این جلسه نوبت به آموزش رسم کانتور در متلب میرسد. کانتور (Contour) نوعی نمودار دو بعدی برای نمایش نمودارهای سه بعدی با استفاده از رنگ یا علامت میباشد. نحوه رسم کانتور دو بعدی و سه بعدی، افزودن لیبل به خطوط کانتور، افزودن عنوان و… از مباحث این جلسه هستند.
با متلب پلاس همراه باشید.
رسم کانتور در متلب
پیش از صحبت درباره نحوه رسم کانتور در متلب، بد نیست که اشارهای به مفهوم نمودارهای کانتور داشته باشیم. کانتور (Contour) در لغت به معنای نقشه برجسته میباشد. در کارهای مهندسی و ترسیمی، منظور از نمودار کانتور، نمایش یک نمودار سه بعدی به صورت دو بعدی است. در واقع با استفاده از خطوط و تغییر رنگ، ارتفاع نمودار سه بعدی (در جهت z) را در دو بعد نمایش میدهیم. خطوط بستهای که در نمودار کانتور مشاهده میشود، در واقع هم ارتفاع میباشند. برای رسم کانتور در متلب از دستور contour استفاده میکنیم. contour(x,y,z) کانتور دادههای وارد شده را رسم میکند. توجه داریم که گرچه کانتور یک شکل دو بعدی است، اما به 3 ورودی نیاز دارد. چرا که در حقیقت یک شکل سه بعدی را به آن میدهیم. خب به سراغ رسم اولین کانتور در یادگیری متلب میرویم.
x = linspace(-2*pi,2*pi);
y = linspace(0,4*pi);
[X,Y] = meshgrid(x,y);
Z = sin(X)+cos(Y);
contour(X,Y,Z)
در کد بالا از دستور meshgrid برای شبکه بندی دادههای x و y استفاده کردهایم. شبکه بندی برای رسم نمودار سه بعدی ضروری است. حال برای اینکه کانتور رسم شده قابل درک باشد، نمودار سه بعدی آن را به همراه کانتور رسم میکنیم. در جلسه بیست و دوم، رسم نمودارهای سه بعدی در متلب به طور کامل ارائه شد. برای مشاهده آن، بر روی لینک قرمز قبل کلیک نمائید.
x = linspace(-2*pi,2*pi);
y = linspace(0,4*pi);
[X,Y] = meshgrid(x,y);
Z = sin(X) + cos(Y);
surfc(X,Y,Z)
شکل سه بعدی فوق به طور کامل آنچه درباره کانتور گفتیم را بیان میکند. نمایش یک شکل سه بعدی در نمودار دو بعدی. خطوط بسته (دایرهای شکل) روی کانتور نیز هم ارتفاع میباشند.
رسم آسان کانتور با ezcontour و fcontour
مشابه با انواع نمودارهای دیگر، امکان رسم آسان و سریع کانتور نیز در متلب وجود دارد. رسم آسان کانتور در متلب با استفاده از ezcontour یا fcontour انجام میشود. ezcontour(fun) نمودار کانتور تابع fun را رسم میکند. دقت کنید که تابع fun بایستی از نوع رشته متنی (درون کوتیشن) باشد. اما در نسخههای جدید نرم افزار متلب، پیشنهاد میشود که بجای ezcontour از fcontour استفاده شود. fcontour(f) نمودار کانتور تابع f را رسم میکند. در این حالت، تابع f بایستی از نوع نمادین (symbolic) یا فانکشن هندل (x@) باشد. برای درک بهتر نحوه رسم آسان کانتور، به مثالهای زیر دقت نمائید.
fcontour(@(x,y) x.^2 - y.^2)
ezcontour('sin(x) + cos(y)')
رسم کانتور با تعداد سطح دلخواه
برای تعیین تعداد سطح کانتور رسم شده در نمودار، کافیست عدد (اسکالر) را در دستور contour اضافه کنیم. contour(x,y,z,n) نمودار کانتور دادههای وارد شده را با n سطح رسم میکند. به مثال زیر دقت کنید. در این مثال، نمودار کانتور اولیه را با 20 سطح رسم میکنیم.
x = linspace(-2*pi,2*pi);
y = linspace(0,4*pi);
[X,Y] = meshgrid(x,y);
Z = sin(X) + cos(Y);
contour(X,Y,Z,20)
تغییر نوع خطوط کانتور در متلب
مشابه با رسم نمودار ساده plot در متلب، در رسم کانتور نیز میتوان ویژگی خطوط را مشخص کرد. این ویژگیها شامل ضخامت، نوع (توپر، نقطه چین، خط چین و…)، مارکر و… میباشند.
- برای تعیین ضخامت خطوط کانتور ابتدا عبارت Linewidth را نوشته و سپس مقدار را وارد میکنیم. مثلا contour(x,y,z,’linewidth’,1.5) نمودار کانتور دادههای x,y,z را با ضخامت 1.5 رسم میکند.
- نوع خطوط: خط چین — ، نقطه خط .- ، نقطه : (این علائم اختصاصی را درون کوتیشن قرار دهید)
برای درک بهتر، یک نمودار کانتور با ضخامت خطوط 1.5 و به صورت نقطه خط با تعداد 10 سطح رسم میکنیم.
x = -2:0.1:2;
y = -2:0.1:2;
[X,Y] = meshgrid(x,y);
Z = X.*exp(-X.^2 - Y.^2);
contour(X,Y,Z,10,'-.','linewidth',1.5)
نمایش مقدار ارتفاع روی خطوط کانتور
در نرم افزار متلب، امکان نمایش مقدار ارتفاع (یا همان مقدار z) بر روی خطوط کانتور وجود دارد. برای این کار عبارت ShowText را درون دستور contour نوشته و پس از آن on را مینویسیم. با این کار، مقدار z به صورت یک عدد بر روی خطوط کانتور نمایش داده میشود. برای مثال، کانتور شکل بالا را درنظر گرفته و مقادیر را روی خطوط آن نمایش میدهیم.
x = -2:0.1:2;
y = -2:0.1:2;
[X,Y] = meshgrid(x,y);
Z = X.*exp(-X.^2 - Y.^2);
contour(X,Y,Z,'ShowText','on')
پر کردن سطوح داخل کانتور
برای پر کردن سطوح داخل کانتور در متلب، بجای رسم با contour، از دستور contourf استفاده میکنیم. طرز استفاده از contourf کاملا مشابه با contour است. حرف f که در انتهای contourf آمده به معنای پر کردن (fill) است.
x = -2:0.1:2;
y = -2:0.1:2;
[X,Y] = meshgrid(x,y);
Z = X.*exp(-X.^2 - Y.^2);
contourf(X,Y,Z)
نمایش راهنمای رنگی کانتور colorbar
نمودارهای کانتور با استفاده از رنگ، یک شکل سه بعدی را در دو بعد نمایش میدهند. به طور پیشفرض در نمودارهای کانتور متلب، رنگ آبی و زرد به پایینترین و بالاترین نقاط اختصاص مییابد. برای نمایش راهنمای رنگی از ارتفاع (مقدار z) نقاط کانتور، پس از رسم آن، دستور colorbar را اجرا میکنیم.
x = -2:0.1:2;
y = -2:0.1:2;
[X,Y] = meshgrid(x,y);
Z = X.*exp(-X.^2 - Y.^2);
contour(X,Y,Z)
colorbar
در شکل فوق، یک ستون رنگی دارای طیف رنگی وسیع از آبی به زرد ایجاد شدهاست. براساس این ستون رنگی، اتفاع هر خط براساس رنگ آن مشخص خواهد شد.
تغییر رنگ کانتور در متلب
امکان تغییر تم رنگ نمودار کانتور نیز در متلب فراهم است. برای تغییر تم رنگی کانتور از دستور colormap استفاده میکنیم. دستور colormap رنگ موردنظر ما را با کد RGB یا رنگهای تعریف شده، ایجاد میکند. رنگهای تعریف شده نیز طیف وسیعی را شامل میشوند که در اکثر موارد کاربردی اند. در شکل زیر تمامی 18 طیف رنگی نرم افزار متلب نشان داده شدهاست.
برای اعمال هر یک از طیفهای رنگی فوق، عبارت اختصاصی آن را پس از colormap مینویسیم. مثلا طیف رنگی hsv از شکل فوق را درنظر بگیرید. برای فعال کردن این تم رنگی روی نمودار کانتور، به صورت زیر عمل میکنیم.
x = -2:0.1:2;
y = -2:0.1:2;
[X,Y] = meshgrid(x,y);
Z = X.*exp(-X.^2 - Y.^2);
contour(X,Y,Z)
colorbar
colormap hsv
رسم چند کانتور کنارهم با subplot
دستور subplot را در همهی آموزشهای رسم نمودار در متلب ارائه کردهایم. با subplot میتوان پنجره را به چند بخش تقسیم کرد و نمودار را در بخش دلخواه رسم نمود. subplot(m,n,p) پنجره را به m سطر و n ستون نقسیم میکند. p نیز شمارهی بخشی است که میخواهیم نمودار را در آن رسم کنیم. برای مثال، دو نمودار کانتور در شکل زیر رسم میکنیم.
x = -2:0.1:2;
y = -2:0.1:2;
[X,Y] = meshgrid(x,y);
Z1 = X.*exp(-X.^2 - Y.^2);
Z2 = sqrt(sin(X).^2 + cos(Y).^2);
subplot(1,2,1)
contour(X,Y,Z1)
subplot(1,2,2)
contour(X,Y,Z2)
افزودن عنوان به کانتور در متلب
برای افزودن عنوان به کانتور (و یا هر نمودار دیگر) در متلب از دستور title(‘text’) استفاده میکنیم. text همان متنی است که برای عنوان درنظر داریم. دقت کنید که این متن حتما باید از جنس رشته متنی بوده و یا درون کوتیشن نوشته شود.
رسم کانتور سه بعدی در متلب
گرچه کانتور اصولا به صورت دو بعدی است و برای نمایش نمودار سه بعدی بکار میرود. اما امکان رسم کانتور سه بعدی در متلب نیز فراهم است. برای رسم کانتور سه بعدی در متلب از دستور contour3 استفاده میکنیم. طرز استفاده از contour3 کاملا مشابه با contour است. در مثال زیر یک کانتور سه بعدی با تعداد 50 سطح رسم میکنیم.
x = -2:0.1:2;
y = -2:0.1:2;
[X,Y] = meshgrid(x,y);
Z = X.^2 - Y.^2;
contour3(X,Y,Z,50)
مقایسه نمودار کانتور، plot3، surf و mesh
کانتور سه بعدی تا حدی به نمودارهای سه بعدی در متلب شبیه است. مخصوصا اگر تعداد سطوح رسم شده را زیاد درنظر بگیریم. در مثال زیر، مقایسهای بین نمایش سه بعدی کانتور، plot3، surf و mesh انجام میدهیم. پنجرهی رسم را به 4 قسمت تقسیم کرده و هر کدام را در یک بخش ترسیم میکنیم. عنوان هر نمودار نیز دستور رسم آن است.
x = -2:0.1:2;
y = -2:0.1:2;
[X,Y] = meshgrid(x,y);
Z = X.^2 - Y.^2;
subplot(2,2,1)
contour3(X,Y,Z,50)
title('contour3, by 50 level')
subplot(2,2,2)
plot3(X,Y,Z)
title('plot3')
subplot(2,2,3)
mesh(X,Y,Z)
title('mesh')
subplot(2,2,4)
surf(X,Y,Z)
title('surf')
هر آنچه برای رسم کانتور دو بعدی در بالا ذکر شد، برای کانتور سه بعدی نیز برقرار است. مواردی مثل ضخامت خطوط، تعداد سطوح، نمایش مقدار سطوح، راهنمای رنگی و… ازین قبیل اند. برای کامل بودن مطلب، یک نمونه از نمودار کانتور سه بعدی با انواع ویژگی رسم میکنیم. این کانتور سه بعدی دارای 50 سطح، ضخامت 2، نقطه چین، راهنمای colorbar و تم رنگی cool است.
x = -2:0.1:2;
y = -2:0.1:2;
[X,Y] = meshgrid(x,y);
Z = X.*exp(-X.^2 - Y.^2);
contour3(X,Y,Z,50,':','linewidth',2)
colorbar
colormap cool
رسم کانتور در متلب، دارای جزئیات بسیار زیادی است. بخشی از این جزئیات در این جلسه ارائه شد. اما جزئیات دیگری مثل؛ نوشتن حروف یونانی، فرمول ریاضی و… نیز وجود دارند. این موارد در انواع نمودارها مشترک میباشند. به همین دلیل، این جزئیات را در آموزش رسم انواع نمودار در متلب ارائه کردهایم. برای مشاهده این موارد روی لینک قرمز قبل کلیک نمائید.
تمرینات این جلسه
در انتهای این جلسه 3 تمرین متلب مربوط به مباحث این جلسه ارائه شده است. لطفا این تمرینها را حل کرده و با پاسخ آن مقایسه کنید. پاسخ تمرینات متلب این جلسه در کانال تلگرام متلب پلاس منتشر میشود. از آیکونهای سمت راست صفحه میتوانید در این کانال عضو شوید.
تمرین اول) نمودار کانتور دو بعدی z = sin(x)*exp(-x2 – y2) را در متلب رسم کنید. ضخامت خطوط 1.5 و تعداد سطوح 20 باشد.
تمرین دوم) نمودار کانتور دو بعدی z = sinh(x)*cos(y) را در متلب رسم کنید. تعداد سطوح را 30 درنظر گرفته و راهنمای رنگی colorbar نیز اضافه کنید.
تمرین سوم) نمودار کانتور سه بعدی تمرین قبل را با 50 سطح کانتوری رسم نمائید.
جمعبندی
جلسه بیست و ششم از سری جلسات آموزش متلب به پایان رسید. این جلسه درباره رسم کانتور در متلب صحبت کردیم. کانتور نوعی نمودار برای نمایش نمودارهای سه بعدی در صفحه دو بعدی است. نحوه رسم، تکنیکها و جزئیات متنوعی برای این نوع نمودار بیان شد. در انتها چند تمرین برای یادگیری بیشتر به شما واگذار کردیم که پاسخ آنها در کانال تلگرامی متلب پلاس وجود دارد. بی صبرانه منتظر نظرات، سوال و ابهامات شما عزیزان هستیم. سعی میکنیم تا هرگونه سوال یا ابهامی که در این باره دارید را پاسخ دهیم.
توصیه میشود که حتما تمرینات این جلسه را انجام بدید و اگر سوال و ابهامی دارید در بخش نظرات (پایین همین صفحه) به ما بگید. از فهرست سمت راست هم میتونید به بقیه جلسات دسترسی داشته باشید.
6 Comments
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
خیلی ممنون از توضیحات و مثالهای کاربردی تون. مدتها بود دنبال یک منبع خوب برای یادگیری رسم کانتور در متلب بودم. مشکل من بیشتر برای شبکه بندی نمودارهای کانتوری بود که با مثالهایی که شما ارائه کردید کاملا حل شد.
واقعا ممنون از سایت بینظیر متلبپلاس.
با سلام و احترام
ممنون از شما کیارش جان.
در مجموعهی متلبپلاس، همهی سعی ما بر ارائهی محتوای آموزشی با کیفیت در زمینه آموزش متلب (کدنویسی و ویدیو) میباشد.
موفق باشید!
خیلی خیلی ممنون
خواهش میکنم بابک جان.
ممنون از لطفت.
با سلام و احترام
من یک سوال داشتم
چکار کنیم که کانتور دارای خط نباشد و فقط طیف رنگ باشد؟
سلام و احترام
برای این کار میتونید از دستور contourf استفاده کنید. بعبارت دیگه، یک حرف f به انتهای دستور contour اضافه کنید. با این کار سطوح روی کانتور با رنگ پر میشن.