ইমাশো: ব্যাপ্তি এবং দিক


86

আমি এমন একটি সফ্টওয়্যার সিস্টেম লিখছি যা 3 ডি ডেটাসেটের মাধ্যমে স্লাইস এবং প্রজেকশনগুলিকে কল্পনা করে। আমি ব্যবহার করছি matplotlibএবং বিশেষত imshowআমার বিশ্লেষণ কোডটি থেকে ফিরে আসা চিত্রের বাফারগুলিকে ভিজ্যুয়ালাইজ করার জন্য।

যেহেতু আমি প্লট অক্ষের সাহায্যে চিত্রগুলি বৌদ্ধিক করতে চাই, তাই আমি ব্যাপ্তি imshowঅক্ষরের সিস্টেমে চিত্র বাফার পিক্সেল স্থানাঙ্ককে মানচিত্রের জন্য যে পরিমাণ কীওয়ার্ড সরবরাহ করি তা ব্যবহার করি ।

দুর্ভাগ্যক্রমে, matplotlibইউনিট সম্পর্কে জানেন না। বলুন (একটি কৃত্রিম উদাহরণ গ্রহণ করে) যে আমি মাত্রার মাত্রা সহ একটি চিত্র প্লট করতে চাই 1000 m X 1 km। সেক্ষেত্রে পরিধিটি কিছু একটা হবে [0, 1000, 0, 1]। যদিও চিত্রের অ্যারেটি বর্গক্ষেত্র, যেহেতু মূলশব্দ দ্বারা প্রসারিত অনুপাতের পরিমাণটি 1000, ফলস্বরূপ প্লট অক্ষগুলিতেও একটি অনুপাত 1000 রয়েছে।

সীমাবদ্ধ কীওয়ার্ডটি ব্যবহার করে আমি যে স্বয়ংক্রিয়ভাবে উত্পন্ন বড় বড় চিহ্নগুলি এবং লেবেলগুলি পেয়েছি তা রাখার সময় কী প্লটের অনুপাত অনুপাতটি জোর করা সম্ভব?

উত্তর:


144

আপনি ম্যানুয়ালি চিত্রের দিকটি সেট করে এটি করতে পারেন (বা চিত্রের ব্যাপ্তিটি পূরণ করতে এটি স্বয়ংক্রিয়-স্কেলকে দিয়ে)।

ডিফল্টরূপে, imshowপ্লটের দিকটি 1 তে সেট করে, কারণ প্রায়শই লোকেরা চিত্রের ডেটার জন্য এটি চায়।

আপনার ক্ষেত্রে, আপনি এর মতো কিছু করতে পারেন:

import matplotlib.pyplot as plt
import numpy as np

grid = np.random.random((10,10))

fig, (ax1, ax2, ax3) = plt.subplots(nrows=3, figsize=(6,10))

ax1.imshow(grid, extent=[0,100,0,1])
ax1.set_title('Default')

ax2.imshow(grid, extent=[0,100,0,1], aspect='auto')
ax2.set_title('Auto-scaled Aspect')

ax3.imshow(grid, extent=[0,100,0,1], aspect=100)
ax3.set_title('Manually Set Aspect')

plt.tight_layout()
plt.show()

এখানে চিত্র বর্ণনা লিখুন


ধন্যবাদ মজাদার দস্তাবেজ scalarবিকল্প সম্পর্কে কিছুই বলে না nothing এটি y-axisপ্রদত্ত স্কেলারের দ্বারা স্কেল হিসাবে উপস্থিত হয় ।
orodbhen

@ জোকিংটনের পক্ষে পৃথক পিক্সেলের আকার পাওয়া সম্ভব। এই আকারটি ডেটা সেট আকারের উপর নির্ভর করে এবং টাইলসের প্যাচওয়ার্কটি আপনার ক্ষেত্রে যেমন ধ্রুবক প্লটে তৈরি করতে পারে।
আলেকজান্ডার সিএসকা

4

plt.imshow()অফিসিয়াল গাইড থেকে , আমরা জানি যে দিকটি অক্ষগুলির দিক অনুপাতকে নিয়ন্ত্রণ করে। আমার কথায় ভাল, দিকটি হ'ল এক্স ইউনিট এবং y ইউনিটের অনুপাত । আমরা বেশিরভাগ সময় এটিকে 1 হিসাবে রাখতে চাই যেহেতু আমরা অজানাভাবে পরিসংখ্যানগুলি বিকৃত করতে চাই না। তবে, প্রকৃতপক্ষে এমন কিছু ক্ষেত্রে রয়েছে যে আমাদের দিকটি ১ ব্যতীত একটি মান নির্দিষ্ট করা দরকার, প্রশ্নকর্তা একটি ভাল উদাহরণ দিয়েছিলেন যে এক্স এবং ওয়াই অক্ষের বিভিন্ন শারীরিক একক থাকতে পারে। ধরা যাক এক্স কিমিটারে এবং y এর মধ্যে মি। সুতরাং একটি 10x10 ডেটার জন্য, সীমাটি [0,10km, 0,10m] হওয়া উচিত = [0, 10000m, 0, 10m]। এই জাতীয় ক্ষেত্রে, আমরা যদি ডিফল্ট দিক = 1 ব্যবহার করতে থাকি তবে চিত্রটির গুণমানটি খুব খারাপ। সুতরাং আমরা আমাদের চিত্রটি অনুকূল করতে দিক = 1000 নির্দিষ্ট করতে পারি। নিম্নলিখিত কোডগুলি এই পদ্ধতির চিত্রিত করে।

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
rng=np.random.RandomState(0)
data=rng.randn(10,10)
plt.imshow(data, origin = 'lower',  extent = [0, 10000, 0, 10], aspect = 1000)

এখানে চিত্র বর্ণনা লিখুন

তবুও, আমি মনে করি এমন একটি বিকল্প আছে যা প্রশ্নকারীর চাহিদা পূরণ করতে পারে। আমরা মাত্রাটি [0,10,0,10] হিসাবে সেট করতে পারি এবং ইউনিটগুলি বোঝাতে অতিরিক্ত xy অক্ষ লেবেল যুক্ত করতে পারি। নীচে কোডগুলি।

plt.imshow(data, origin = 'lower',  extent = [0, 10, 0, 10])
plt.xlabel('km')
plt.ylabel('m')

এখানে চিত্র বর্ণনা লিখুন

একটি সঠিক চিত্র তৈরি করতে , আমাদের সর্বদা সেই x_max-x_min = x_res * data.shape[1]এবং y_max - y_min = y_res * data.shape[0]কোথায়, মনে রাখা উচিত extent = [x_min, x_max, y_min, y_max]। ডিফল্টরূপে, aspect = 1মানে ইউনিট পিক্সেলটি বর্গক্ষেত্র। এই ডিফল্ট আচরণটি x_res এবং y_res এর জন্যও বিভিন্ন রকমের মান আছে যা বিভিন্ন মান। পূর্ববর্তী উদাহরণটি প্রসারিত করে, ধরে নেওয়া যাক যে x_res 1.5 হয় এবং y_res 1 হয় সুতরাং পরিধিটি [0,15,0,10] এর সমান হওয়া উচিত। ডিফল্ট দিকটি ব্যবহার করে আমাদের আয়তক্ষেত্রাকার রঙ পিক্সেল থাকতে পারে, যদিও ইউনিট পিক্সেলটি এখনও বর্গক্ষেত্রের!

plt.imshow(data, origin = 'lower',  extent = [0, 15, 0, 10])
# Or we have similar x_max and y_max but different data.shape, leading to different color pixel res.
data=rng.randn(10,5)
plt.imshow(data, origin = 'lower',  extent = [0, 5, 0, 5])

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

কালার পিক্সেলের দিকটি হ'ল x_res / y_res। ইউনিট পিক্সেলের দিকটিতে এর দিকটি সেট করা (যেমন aspect = x_res / y_res = ((x_max - x_min) / data.shape[1]) / ((y_max - y_min) / data.shape[0])) সর্বদা বর্গাকার রঙের পিক্সেল দেয়। আমরা দিক = 1.5 কে পরিবর্তন করতে পারি যাতে এক্স-অক্ষ এককটি 1.5 গুণ y- অক্ষ ইউনিট হয়, যার ফলে বর্গাকার রঙের পিক্সেল এবং বর্গাকার পুরো চিত্র কিন্তু আয়তক্ষেত্রাকার পিক্সেল ইউনিট হয়। স্পষ্টতই, এটি সাধারণত গৃহীত হয় না।

data=rng.randn(10,10)
plt.imshow(data, origin = 'lower',  extent = [0, 15, 0, 10], aspect = 1.5)

এখানে চিত্র বর্ণনা লিখুন

সর্বাধিক অনাকাঙ্ক্ষিত কেসটি 1.2 এর মতো একটি স্বেচ্ছাসেবী মান নির্ধারণ করে যা স্কোয়ার ইউনিট পিক্সেল বা বর্গাকার রঙের পিক্সেলকে না নিয়ে যায়।

plt.imshow(data, origin = 'lower',  extent = [0, 15, 0, 10], aspect = 1.2)

এখানে চিত্র বর্ণনা লিখুন

দীর্ঘ গল্প সংক্ষিপ্ত, এটি সর্বদা সঠিক মাত্রা নির্ধারণ করা এবং ম্যাটপ্ল্লিটিবকে আমাদের জন্য বাকি জিনিসগুলি করতে দেয় (যদিও x_res! = Y_res)! আবশ্যক হলেই দিকটি পরিবর্তন করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.