গ্রাফের সাথে মেলে ম্যাটপ্লটলিব রঙের আকার নির্ধারণ করুন


161

আমি সত্যের পরে ফটোশপ ব্যবহারের সংক্ষিপ্ত আকারের মতো গ্রাফের মতো একই গ্রাফিকের গ্রাফটি পেতে পারি না Photos আমি কীভাবে মিলবে উচ্চতাগুলি?রঙ বার আকারের মিল নয় mat



@ imjohns3 পোস্টে কোনও কিছুই রঙ বারের জন্য কিছু করছে বলে মনে হয় না। আমি যাই সেট করি না কেন এটি একই আকারে থেকে যায়। আমি যদি ভগ্নাংশ নির্ধারণ করি এবং সঙ্কুচিত করি, তবে, বর্ণ বারটি একই থাকাকালীন গ্রাফের আকার পরিবর্তন হবে, যতক্ষণ না আমরা ইতিমধ্যে যা পেয়েছি তা ফিরে না পাওয়া পর্যন্ত তারা কিছু করা বন্ধ করে দেয়।
এলিয়ট

দস্তাবেজগুলি পরীক্ষা করুন - matplotlib.org/api/colorbar_api.html - এবং ব্যবহার fractionবা shrinkনিবন্ধগুলি।
বোল্টজম্যানব্রেন

উত্তর:


194

আপনি ম্যাটপ্ল্লোলিব এক্সিসডিভিডার দিয়ে সহজেই এটি করতে পারেন ।

লিঙ্কযুক্ত পৃষ্ঠা থেকে প্রাপ্ত উদাহরণটি সাবপ্লট ব্যবহার না করেও কাজ করে:

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
import numpy as np

plt.figure()
ax = plt.gca()
im = ax.imshow(np.arange(100).reshape((10,10)))

# create an axes on the right side of ax. The width of cax will be 5%
# of ax and the padding between cax and ax will be fixed at 0.05 inch.
divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size="5%", pad=0.05)

plt.colorbar(im, cax=cax)

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


1
আমি সাবপ্লট এর ভিতরে কাজ করছি না, সুতরাং এটি প্রযোজ্য নয়।
এলিয়ট

অনেক ঝাঁকুনির পরে, এটি কাজ করে। সাবপ্লট_এডজাস্টের সাথে যোগাযোগ করার ক্ষেত্রে অনেক সমস্যা হয়েছে, আপনাকে একে অপরের সাথে সম্পর্কিত সঠিক জায়গায় কলগুলি পেতে হবে get
এলিয়ট

11
এটি গ্রাফের আকার পরিবর্তন করতে কিছুটা পরিবর্তন করছে। আমার কাছে 2x2 গ্রিডে 4 জন রয়েছে, তবে কেবল ডানদিকে দু'একটি বার থাকা উচিত (স্কেল সারি অনুসারে প্রযোজ্য)। তবে এটি তাদের একই আকার নয় makes আমি কেবল রঙবার কল (ডিভাইডার কল সহ) না করার চেষ্টা করেছি, তবে অবশ্যই এটি খালি সাদা বাক্স এবং পাশের নম্বরগুলি রেখে গেছে। আমি কীভাবে তাদের সবগুলিতে বার না লাগিয়ে একটি সামঞ্জস্য আকার পেতে পারি?
এলিয়ট

@ বোগাট্রন দুর্ভাগ্যক্রমে এটি অনুমান অক্ষের সাথে কাজ করে না
বোগদান

আপনি যদি কোনও শিরোনাম ব্যবহার করে যুক্ত করতে চান তবে plt.titleএটি ডানদিকে অদলবদল প্রদর্শিত হবে। এ থেকে উত্তরণের কোনও উপায় আছে কি?
ব্যবহারকারী 2820579

224

এই সংমিশ্রণটি (এবং এগুলির নিকটতম মানগুলি) রঙ বারবার প্লটটিতে ছোট আকারে রাখার জন্য "ম্যাজিকালি" কাজ করে বলে মনে হচ্ছে, আকারের আকার যাই হোক না কেন।

plt.colorbar(im,fraction=0.046, pad=0.04)

এটিতে অক্ষটি ভাগ করে নেওয়াও প্রয়োজন হয় না যা প্লটটি স্কোয়ারের বাইরে চলে যেতে পারে।


4
এটি কিছু ক্ষেত্রে কার্যকর হতে পারে, তবে সাধারণভাবে তা হয় না। উদাহরণস্বরূপ, আসল প্রশ্নের মতো এমন কিছু প্লট করার চেষ্টা করুন, যার উচ্চতা দ্বিগুণ।
ম্যাথিয়াস

ভগ্নাংশের বিকল্পটি আপনার উল্লেখ করা ক্ষেত্রে এখনও কাজ করবে বলে মনে হয়, যদি প্লটের উচ্চতার সাথে মেলে যদি স্কেল করা হয়। (এমপিএল ভি 1.4.3)
স্কাইটেকার

6
এটি করার একমাত্র সর্বজনীন উপায়। অক্সেক্স_গ্রিড 1 এর সমাধানগুলি জিওএক্সেসের মতো অনুমানিত অক্ষগুলির জন্য কাজ করবে না।
বোগদান

ওএমজি এটি দুর্দান্ত। সমাধানের জন্য আপনাকে অনেক ধন্যবাদ
2D_

3
জবাবে @ মাথিয়াসের মন্তব্যে। এই কৌশলটি ব্যবহার করে চিত্রটি খুব প্রশস্ত যেখানে আপনি তার ক্ষেত্রে সঠিক করতে পারেন: আপনার চিত্রটি im_ratio = data.shape[0]/data.shape[1] plt.colorbar(im,fraction=0.046*im_ratio, pad=0.04)কোথায় data
eindzl

29

@ বোগাস্ট্রন ইতিমধ্যে ম্যাটপ্ল্লোলিব ডক্স দ্বারা প্রস্তাবিত উত্তর দিয়েছেন যা সঠিক উচ্চতা উত্পন্ন করে তবে এটি একটি ভিন্ন সমস্যা প্রবর্তন করে। এখন রঙের বারের প্রস্থ (পাশাপাশি রঙ বার এবং প্লটের মধ্যবর্তী স্থান) প্লটের প্রস্থের সাথে পরিবর্তিত হয়। অন্য কথায়, কালারবারের অনুপাতটি আর ঠিক করা হয়নি।

সঠিক উচ্চতা এবং প্রদত্ত দিক অনুপাত উভয়ই পেতে আপনাকে রহস্যময় axes_grid1মডিউলটির থেকে আরও গভীর গভীরতা অর্জন করতে হবে ।

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable, axes_size
import numpy as np

aspect = 20
pad_fraction = 0.5

ax = plt.gca()
im = ax.imshow(np.arange(200).reshape((20, 10)))
divider = make_axes_locatable(ax)
width = axes_size.AxesY(ax, aspect=1./aspect)
pad = axes_size.Fraction(pad_fraction, width)
cax = divider.append_axes("right", size=width, pad=pad)
plt.colorbar(im, cax=cax)

নোট করুন যে এটি রঙিন বারের প্রশস্ততা প্লটের উচ্চতা নির্দিষ্ট করে ( চিত্রটির প্রস্থের বিপরীতে , যেমনটি আগে ছিল)।

কালারবার এবং প্লটের মধ্যে ব্যবধানটি এখন রঙ বারের প্রস্থের একটি ভগ্নাংশ হিসাবে নির্দিষ্ট করা যেতে পারে যা চিত্রের প্রস্থের ভগ্নাংশের চেয়ে অনেক বেশি অর্থবহ সংখ্যা number

রঙিনবারের সাথে চিত্রের প্লট

হালনাগাদ:

আমি এই বিষয়ের উপর একটি আইপথন নোটবুক তৈরি করেছি , যেখানে আমি উপরের কোডটি সহজেই ব্যবহারযোগ্য ক্রিয়াকলাপে প্যাক করেছি:

import matplotlib.pyplot as plt
from mpl_toolkits import axes_grid1

def add_colorbar(im, aspect=20, pad_fraction=0.5, **kwargs):
    """Add a vertical color bar to an image plot."""
    divider = axes_grid1.make_axes_locatable(im.axes)
    width = axes_grid1.axes_size.AxesY(im.axes, aspect=1./aspect)
    pad = axes_grid1.axes_size.Fraction(pad_fraction, width)
    current_ax = plt.gca()
    cax = divider.append_axes("right", size=width, pad=pad)
    plt.sca(current_ax)
    return im.axes.figure.colorbar(im, cax=cax, **kwargs)

এটি এর মতো ব্যবহার করা যেতে পারে:

im = plt.imshow(np.arange(200).reshape((20, 10)))
add_colorbar(im)

1
এটি একটি সত্যিই সহায়ক ছোট ফাংশন! সতর্কতার একটি শব্দ হ'ল আপনি একাধিক রঙিন বার যুক্ত করতে চাইলে এটি কাজ করে না, কারণ তারা একে অপরের শীর্ষে উপস্থিত হয়।
ডেভিড হল

22

আমি উপরের সমস্ত উত্তর প্রশংসা করি। যাইহোক, কিছু উত্তর এবং মন্তব্য মত নির্দিষ্ট, axes_grid1মডিউল না ঠিকানা GeoAxes, সামঞ্জস্য যেহেতু পারেন fraction, pad, shrink, এবং অন্যান্য অনুরূপ পরামিতি না অগত্যা খুব সুনির্দিষ্ট আদেশ, যা সত্যিই আমাকে বিরক্ত করে দিতে পারেন। আমি বিশ্বাস করি যে এর দ্বারা প্রদত্ত যে সমস্ত সমস্যা উল্লেখ করা হয়েছে colorbarতার axesসমাধানের জন্য এটির দেওয়া আরও ভাল সমাধান হতে পারে।

কোড

import matplotlib.pyplot as plt
import numpy as np

fig=plt.figure()
ax = plt.axes()
im = ax.imshow(np.arange(100).reshape((10,10)))

# Create an axes for colorbar. The position of the axes is calculated based on the position of ax.
# You can change 0.01 to adjust the distance between the main image and the colorbar.
# You can change 0.02 to adjust the width of the colorbar.
# This practice is universal for both subplots and GeoAxes.

cax = fig.add_axes([ax.get_position().x1+0.01,ax.get_position().y0,0.02,ax.get_position().height])
plt.colorbar(im, cax=cax) # Similar to fig.colorbar(im, cax = cax)

ফলাফল

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

পরে, আমি দেখতে পেয়েছি যে matplotlib.pyplot.colorbarসরকারী ডকুমেন্টেশনগুলিax বিকল্পও দেয় যা বিদ্যমান অক্ষগুলি যা রঙবারের জন্য জায়গা সরবরাহ করবে। সুতরাং, এটি একাধিক সাবপ্লটগুলির জন্য দরকারী, নিম্নলিখিত দেখুন see

কোড

fig, ax = plt.subplots(2,1,figsize=(12,8)) # Caution, figsize will also influence positions.
im1 = ax[0].imshow(np.arange(100).reshape((10,10)), vmin = -100, vmax =100)
im2 = ax[1].imshow(np.arange(-100,0).reshape((10,10)), vmin = -100, vmax =100)
fig.colorbar(im1, ax=ax)

ফলাফল

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

আবার, আপনি আমার দৃষ্টিভঙ্গি থেকে আরও সঠিক উপায়, ক্যাক্স নির্দিষ্ট করেও অনুরূপ প্রভাব অর্জন করতে পারেন।

কোড

fig, ax = plt.subplots(2,1,figsize=(12,8))
im1 = ax[0].imshow(np.arange(100).reshape((10,10)), vmin = -100, vmax =100)
im2 = ax[1].imshow(np.arange(-100,0).reshape((10,10)), vmin = -100, vmax =100)
cax = fig.add_axes([ax[1].get_position().x1-0.25,ax[1].get_position().y0,0.02,ax[0].get_position().y1-ax[1].get_position().y0])
fig.colorbar(im1, cax=cax)

ফলাফল

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


@ এইচএস-নীহারিকা আপনার মন্তব্যের জন্য ধন্যবাদ এবং আমি আনন্দিত যে আপনি এটি উপভোগ করেছেন। :)
ফাই ইয়াও

সত্যিই আশ্চর্যজনক উত্তর। ধন্যবাদ!!
এপিডিয়াং

11

আপনি তৈরি যখন colorbar ভগ্নাংশ এবং / অথবা পরামিতিগুলি সঙ্কুচিত করে ব্যবহার চেষ্টা করবেন।

নথি থেকে:

ভগ্নাংশ 0.15; কালারবারের জন্য ব্যবহার করতে মূল অক্ষের ভগ্নাংশ

সঙ্কুচিত 1.0; ভগ্নাংশ যা দ্বারা রঙবার সঙ্কুচিত করা


1
আমি যদি ১.০ এবং ভগ্নাংশকে কোনও কিছুতে সঙ্কুচিত করে থাকি তবে এটি গ্রাফকে সঙ্কুচিত করে, কালারবারের আকারকে কোনওভাবেই প্রভাব ফেলবে না, যতক্ষণ না ভগ্নাংশ পরিবর্তনের ফলে এটি আমার কাছে ইতিমধ্যে ছিল ঠিক তেমন কারণ হয়, যার বিন্দুতে তাদের পরিবর্তন করা কিছু করা বন্ধ করে দেয়।
এলিয়ট

ঠিক কোথায় আপনি তাদের উল্লেখ করছেন সেগুলি colorbar()ফাংশন বা পদ্ধতির পরামিতি হতে হবে ।
স্টিভ বার্নস

ধন্যবাদ। শুধু সঙ্কুচিত প্যারামিটার নির্দিষ্ট করা প্রয়োজন এবং এটি যাদু এর মতো কাজ করে!
কোডিংনো

11

উপরের সমস্ত সমাধানগুলি ভাল, তবে আমি @ স্টিভ এবং @ বেজোটার সেরা পছন্দ কারণ তারা অভিনব কলগুলিতে জড়িত না এবং সর্বজনীন are

সর্বজনীন দ্বারা আমি বোঝাতে চাইছি যেটি সহ যে কোনও ধরণের অক্ষের সাথে কাজ করে GeoAxes। উদাহরণস্বরূপ, এটি ম্যাপিংয়ের জন্য আপনার কাছে অনুমানের অক্ষ রয়েছে:

projection = cartopy.crs.UTM(zone='17N')
ax = plt.axes(projection=projection)
im = ax.imshow(np.arange(200).reshape((20, 10)))

একটি কল

cax = divider.append_axes("right", size=width, pad=pad)

এর সাথে ব্যর্থ হবে: KeyException: map_projection

সুতরাং, সব ধরণের অক্ষের সাথে রঙিন আকারের একমাত্র সর্বজনীন উপায় হ'ল:

ax.colorbar(im, fraction=0.046, pad=0.04)

আপনার সেরা আকার পেতে 0.035 থেকে 0.046 পর্যন্ত ভগ্নাংশ নিয়ে কাজ করুন। যাইহোক, ভগ্নাংশ এবং প্যাডিগের মানগুলি আপনার প্লটটির জন্য সেরা ফিটের জন্য সামঞ্জস্য করা দরকার এবং রঙবারের দিকটি উল্লম্ব অবস্থান বা অনুভূমিকের মধ্যে থাকলে তার উপর নির্ভর করে পৃথক হবে।


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