পাইথন / ম্যাটপ্ল্লিটিব ব্যবহার করে 3 ডি প্লটের জন্য "ক্যামেরা অবস্থান" কীভাবে সেট করবেন?


134

আমি 3 ডি ডেটার দুর্দান্ত প্লট তৈরি করতে এমপ্লট 3 ডি কীভাবে ব্যবহার করব তা শিখছি এবং আমি এ পর্যন্ত বেশ খুশি। এই মুহুর্তে আমি যা করার চেষ্টা করছি তা হচ্ছে একটি ঘোরানো পৃষ্ঠের সামান্য অ্যানিমেশন। সেই উদ্দেশ্যে, আমাকে 3D প্রক্ষেপণের জন্য একটি ক্যামেরা অবস্থান নির্ধারণ করতে হবে। আমি মনে করি এটি অবশ্যই সম্ভব কারণ ম্যাটপ্ল্লোলিব ইন্টারেক্টিভভাবে ব্যবহার করার সময় মাউস ব্যবহার করে কোনও পৃষ্ঠকে ঘোরানো যেতে পারে। তবে আমি কীভাবে এটি কোনও স্ক্রিপ্ট থেকে করতে পারি? আমি mpl_toolkits.mplot3d.proj3d তে প্রচুর রূপান্তর পেয়েছি তবে কীভাবে এগুলি আমার উদ্দেশ্যে ব্যবহার করা যায় তা আমি খুঁজে পাই না এবং আমি যা করার চেষ্টা করছি তার কোনও উদাহরণ পাইনি।


2
কীভাবে বৃহত্তর নোটবুকে ইন্টারেক্টিভভাবে ঘোরানো যায় সেই বিষয়ে ভাবছেন তাদের পক্ষে সাইড নোট: আপনি ব্যবহার করতে পারেন%matplotlib notebook
YvesgereY

ডান মাউস বোতামটি ধরে রাখার সময়ও টেনে নিয়ে যাওয়া ক্যামেরার দূরত্ব পরিবর্তন করে।
LoMaPh

এই ধরণের ভিজুয়ালাইজেশনের জন্য, আমি মায়াবিকে একবার চেষ্টা করতাম।
টেকটোপোডা

উত্তর:


158

"ক্যামেরা অবস্থান" দ্বারা মনে হচ্ছে আপনি 3 ডি প্লটটি দেখতে যে এলিভেশন এবং আজিমুথ কোণটি ব্যবহার করছেন তা সামঞ্জস্য করতে চান। আপনি এটি দিয়ে সেট করতে পারেন ax.view_init। আমি প্রথমে প্লটটি তৈরি করতে নীচের স্ক্রিপ্টটি ব্যবহার করেছি, তারপরে আমি একটি ভাল উচ্চতা নির্ধারণ করেছি, বা elevথেকে আমার প্লটটি দেখার জন্য view তারপরে আমি আজিমুথ কোণটি অ্যাডজাস্ট করেছিলাম বা azimআমার প্লটটির চারপাশে পুরো ৩ 360০ ডিগ্রি পরিবর্তিত করে প্রতিটি উদাহরণে চিত্রটি সংরক্ষণ করেছিলাম (এবং প্লটটি সংরক্ষণ করার সাথে সাথে কোন অ্যাজিমুথ কোণটি উল্লেখ করেছি)। আরও জটিল ক্যামেরা প্যানের জন্য, আপনি পছন্দসই প্রভাব অর্জন করতে উচ্চতা এবং কোণ উভয়ই সামঞ্জস্য করতে পারেন।

    from mpl_toolkits.mplot3d import Axes3D
    ax = Axes3D(fig)
    ax.scatter(xx,yy,zz, marker='o', s=20, c="goldenrod", alpha=0.6)
    for ii in xrange(0,360,1):
        ax.view_init(elev=10., azim=ii)
        savefig("movie%d.png" % ii)

26
আমাকে মার! পার্শ্ব নোটে, এগুলি সম্পত্তি ax.elevএবং ax.azimবৈশিষ্ট্য হিসাবে উপলব্ধ । আপনি একই লিখিত প্রভাব অর্জন করতে সবেমাত্র লিখে ax.azim = iiবা এমনকি ax.azim += 1লিখতেও পারেন।
জো কিংটন

1
দুঃখিত আমি আপনাকে মারলাম কিন্তু চারদিকে ন্যায্য পয়েন্ট। এটি আমার কেবল একটি কোডিংয়ের অংশও রয়েছে, কেবলমাত্র ভিউ_ইনিট এবং সেভফিগের চেয়ে লুপের মধ্যে আরও কিছু ছিল। =)
মহাজাগতিক

4
ধন্যবাদ মহাজাগতিক ও জো, আমি ঠিক তাই খুঁজছিলাম। যেহেতু আমি এখন কীভাবে সন্ধান করব তা জানতাম, তাই আমি ax.distও পেয়েছি যা - ax.azim এবং ax.elev এর সাথে মিলিয়ে - ক্যামেরার অবস্থানটিকে মেরু স্থানাঙ্কে সেট করতে দেয়।
Andreas Bleuler

যদি এটি উত্তর হয় - আপনি দয়া করে এটি চেক-মার্ক করতে পারেন? ধন্যবাদ।
মহাজাগতিক

12
আপনি ax.dist = 15 দ্বারা ডিফল্ট ক্যামেরা এবং অবজেক্ট পয়েন্টের মধ্যে দূরত্বও নির্ধারণ করতে পারেন
টিম

14

কী কাজে লাগবে তা হ'ল নতুন প্লটটিতে ক্যামেরার অবস্থান প্রয়োগ করা। সুতরাং আমি চক্রান্ত করছি, তারপরে দূরত্ব পরিবর্তন করে মাউসটি নিয়ে প্লটটি চারদিকে সরান। তারপরে অন্য প্লটের দূরত্ব সহ ভিউটি প্রতিলিপি করার চেষ্টা করুন। আমি দেখতে পেয়েছি যে axx.ax.get_axes () আমাকে পুরানো .azim এবং .elev দিয়ে একটি বস্তু পেয়েছে।

পাইথনে ...

axx=ax1.get_axes()
azm=axx.azim
ele=axx.elev
dst=axx.dist       # ALWAYS GIVES 10
#dst=ax1.axes.dist # ALWAYS GIVES 10
#dst=ax1.dist      # ALWAYS GIVES 10

পরে 3 ডি গ্রাফ ...

ax2.view_init(elev=ele, azim=azm) #Works!
ax2.dist=dst                       # works but always 10 from axx

সম্পাদনা 1 ... ঠিক আছে, ক্যামেরার অবস্থানটি .dist মান সম্পর্কে ভুল চিন্তাভাবনা। পুরো গ্রাফের জন্য এক ধরণের হ্যাকি স্কেলার গুণক হিসাবে এটি সমস্ত কিছুর উপরে উঠে যায়।

এটি দর্শনটির বাড়াতে / জুম করার জন্য কাজ করে:

xlm=ax1.get_xlim3d() #These are two tupples
ylm=ax1.get_ylim3d() #we use them in the next
zlm=ax1.get_zlim3d() #graph to reproduce the magnification from mousing
axx=ax1.get_axes()
azm=axx.azim
ele=axx.elev

পরে গ্রাফ ...

ax2.view_init(elev=ele, azim=azm) #Reproduce view
ax2.set_xlim3d(xlm[0],xlm[1])     #Reproduce magnification
ax2.set_ylim3d(ylm[0],ylm[1])     #...
ax2.set_zlim3d(zlm[0],zlm[1])     #...

হ্যাকি স্কেলারের গুণকটি কল করার জন্য +1। আপনি দৃষ্টিভঙ্গির জন্য আশা করা যদি এটি খুব বিরক্তিকর।
ব্যবহারকারী5920660
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.