मैं इस तरह के एक के रूप में imshow रेखांकन पर colorbar नहीं मिल सकता है, इस ग्राफ के रूप में एक ही ऊंचाई हो, इस तथ्य के बाद फ़ोटोशॉप का उपयोग करने की कमी। मैं मैच के लिए ऊंचाइयों को कैसे प्राप्त करूं?
मैं इस तरह के एक के रूप में imshow रेखांकन पर colorbar नहीं मिल सकता है, इस ग्राफ के रूप में एक ही ऊंचाई हो, इस तथ्य के बाद फ़ोटोशॉप का उपयोग करने की कमी। मैं मैच के लिए ऊंचाइयों को कैसे प्राप्त करूं?
जवाबों:
आप इसे आसानी से एक matplotlib AxisDivider के साथ कर सकते हैं ।
लिंक पृष्ठ से उदाहरण सबप्लॉट का उपयोग किए बिना भी काम करता है:
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)
plt.title
, तो इसे दाईं ओर स्वैप किया जाएगा। क्या इससे उबरने का कोई तरीका है?
यह संयोजन (और इन के पास मूल्य) मेरे लिए "जादुई" काम करने लगता है, चाहे वह डिस्प्ले का आकार कितना भी क्यों न हो, रंगकर्मी को साजिश की ओर ले जाता है।
plt.colorbar(im,fraction=0.046, pad=0.04)
इसके लिए धुरी को साझा करने की भी आवश्यकता नहीं होती है जो कथानक को वर्ग से बाहर कर सकती है।
im_ratio = data.shape[0]/data.shape[1]
plt.colorbar(im,fraction=0.046*im_ratio, pad=0.04)
कहां data
है।
@bogatron ने पहले ही matplotlib डॉक्स द्वारा सुझाए गए उत्तर दिए , जो सही ऊंचाई का उत्पादन करता है, लेकिन यह एक अलग समस्या पेश करता है। अब प्लॉट की चौड़ाई के साथ कलरबार की चौड़ाई (साथ ही कलरबार और प्लॉट के बीच की जगह) बदल जाती है। दूसरे शब्दों में, कलरबार का पहलू अनुपात अब तय नहीं है।
सही ऊंचाई और दिए गए पहलू अनुपात दोनों को प्राप्त करने के लिए , आपको रहस्यमय 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)
ध्यान दें कि यह colorbar की चौड़ाई को निर्दिष्ट करता है भूखंड की ऊंचाई ( आंकड़े की चौड़ाई के विपरीत , जैसा कि यह पहले था)।
Colorbar और प्लॉट के बीच रिक्ति को अब colorbar की चौड़ाई के एक अंश के रूप में निर्दिष्ट किया जा सकता है, जो IMHO है जो आंकड़ा चौड़ाई के एक अंश से अधिक सार्थक संख्या है।
अपडेट करें:
मैंने इस विषय पर एक IPython नोटबुक बनाई , जहाँ मैंने उपरोक्त कोड को आसानी से पुन: उपयोग करने योग्य फ़ंक्शन में पैक किया:
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)
मैं उपरोक्त सभी उत्तरों की सराहना करता हूं। हालांकि, कुछ जवाब और टिप्पणियों की तरह ने कहा, 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
विकल्प देता है, जो मौजूदा कुल्हाड़ियों हैं जो कलरबार के लिए जगह प्रदान करेंगे। इसलिए, यह कई सबप्लॉट्स के लिए उपयोगी है, निम्नलिखित देखें।
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)
फिर, आप इसी तरह के प्रभावों को भी निर्दिष्ट कर सकते हैं जैसे कि cax को निर्दिष्ट करके, मेरे दृष्टिकोण से अधिक सटीक तरीका।
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)
जब आप colorbar
भिन्न और / या मापदंडों का उपयोग करके कोशिश करते हैं।
दस्तावेजों से:
अंश 0.15; मूल अक्षों का अंश जो कलरबार के लिए उपयोग करता है
1.0 हटना; अंश जिसके द्वारा कोलतार सिकुड़ता है
colorbar()
फ़ंक्शन या विधि के लिए पैरामीटर हैं ।
उपरोक्त सभी समाधान अच्छे हैं, लेकिन मुझे @ स्टीव्स और @ बेजोटा पसंद हैं क्योंकि वे फैंसी कॉल को शामिल नहीं करते हैं और सार्वभौमिक हैं।
सार्वभौमिक से मेरा मतलब है कि किसी भी प्रकार की कुल्हाड़ियों के साथ काम करता है 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 तक अंश के साथ काम करें। हालांकि, आपके प्लॉट के लिए सबसे उपयुक्त होने के लिए अंश और पैडिग के लिए मूल्यों को समायोजित करने की आवश्यकता होगी और यह अलग-अलग होगा यदि रंगबार का उन्मुखीकरण ऊर्ध्वाधर स्थिति या क्षैतिज में है।
shrink
जब पैरामीटर fraction
के साथ एक साथ pad
वांछित परिणाम पर्याप्त उत्पादन नहीं करते।