ग्राफ़ से मिलान करने के लिए Matplotlib colorbar आकार सेट करें


161

मैं इस तरह के एक के रूप में imshow रेखांकन पर colorbar नहीं मिल सकता है, इस ग्राफ के रूप में एक ही ऊंचाई हो, इस तथ्य के बाद फ़ोटोशॉप का उपयोग करने की कमी। मैं मैच के लिए ऊंचाइयों को कैसे प्राप्त करूं?रंगबार के आकार का उदाहरण बेमेल



@ imjohns3 उस पोस्ट में कुछ भी रंग पट्टी के लिए कुछ भी नहीं लगता है। यह एक ही आकार रहता है चाहे मैं कुछ भी सेट करूं। यदि मैं अंश सेट करता हूं और सिकुड़ता हूं, हालांकि, रंग पट्टी के समान रहने पर ग्राफ का आकार बदल जाएगा, जब तक कि हम पहले से ही मेरे पास वापस नहीं आ जाते, तब तक वे कुछ भी करना बंद कर देते हैं।
इलियट

डॉक्स - matplotlib.org/api/colorbar_api.html - देखें और उपयोग करें fractionया shrinkआर्ग करें।
बोल्ट्जमैनब्रैन

जवाबों:


194

आप इसे आसानी से एक 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)

यहां छवि विवरण दर्ज करें


1
मैं एक सबप्लॉट के अंदर काम नहीं कर रहा हूं, इसलिए यह लागू नहीं है।
इलियट

बहुत छेड़छाड़ के बाद, यह काम करने के लिए मिला। Subplot_adjust के साथ बातचीत करने में बहुत परेशानी होती है, आपको एक दूसरे के सापेक्ष सही स्थानों पर कॉल प्राप्त करना होता है।
इलियट

11
यह ग्राफ़ के आकार को थोड़ा बदल रहा है। एक 2x2 ग्रिड में मेरे पास 4 हैं, लेकिन केवल दो को बार के दाईं ओर चाहते हैं (पंक्ति द्वारा स्केल लागू होता है)। हालाँकि यह उन्हें समान आकार नहीं देता है। मैंने कोशिश की है कि सिर्फ कलरबार कॉल (डिवाइडर कॉल के साथ) न हो, लेकिन निश्चित रूप से यह खाली सफेद बॉक्स और नंबर को साइड में छोड़ देता है। मैं उन सभी पर बार लगाए बिना उन्हें लगातार आकार कैसे प्राप्त करूं?
इलियट

@bogatron दुर्भाग्य से यह अनुमानित अक्षों के साथ काम नहीं करता है
बोगदान

यदि आप किसी शीर्षक का उपयोग करना चाहते हैं plt.title, तो इसे दाईं ओर स्वैप किया जाएगा। क्या इससे उबरने का कोई तरीका है?
user2820579

224

यह संयोजन (और इन के पास मूल्य) मेरे लिए "जादुई" काम करने लगता है, चाहे वह डिस्प्ले का आकार कितना भी क्यों न हो, रंगकर्मी को साजिश की ओर ले जाता है।

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

इसके लिए धुरी को साझा करने की भी आवश्यकता नहीं होती है जो कथानक को वर्ग से बाहर कर सकती है।


4
यह कुछ मामलों में काम कर सकता है, लेकिन सामान्य तौर पर यह नहीं होता है। कोशिश करें, जैसे, मूल प्रश्न में कुछ ऐसा प्लॉट करना, जिसकी ऊंचाई दो बार चौड़ाई है।
मथियास

यदि आप उल्लेख किए गए मामले में अंश विकल्प अभी भी काम करते हैं, अगर साजिश की ऊंचाई से मिलान करने के लिए स्केल किया गया है। (mpl
v1.4.3

6
यह इसे करने का एकमात्र सार्वभौमिक तरीका है। Axex_grid1 के साथ समाधान अनुमानित अक्षों जैसे कि GeoAxes के लिए काम नहीं करेगा।
बोगदान

OMG यह कमाल है। समाधान के लिए बहुत बहुत धन्यवाद
2D_

3
@Matthias टिप्पणी के जवाब में। आप इस मामले के लिए सही कर सकते हैं जहां इस चाल का उपयोग करके छवि बहुत चौड़ी है: आपकी छवि im_ratio = data.shape[0]/data.shape[1] plt.colorbar(im,fraction=0.046*im_ratio, pad=0.04)कहां dataहै।
eindzl

30

@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)

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विकल्प देता है, जो मौजूदा कुल्हाड़ियों हैं जो कलरबार के लिए जगह प्रदान करेंगे। इसलिए, यह कई सबप्लॉट्स के लिए उपयोगी है, निम्नलिखित देखें।

कोड

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)

परिणाम

यहां छवि विवरण दर्ज करें


@ HS-nebula आपकी टिप्पणियों के लिए धन्यवाद और मुझे खुशी है कि आप इसका आनंद ले रहे हैं। :)
फी याओ

वाकई अद्भुत जवाब। धन्यवाद!!
एपिसोड २yang

11

जब आप colorbarभिन्न और / या मापदंडों का उपयोग करके कोशिश करते हैं।

दस्तावेजों से:

अंश 0.15; मूल अक्षों का अंश जो कलरबार के लिए उपयोग करता है

1.0 हटना; अंश जिसके द्वारा कोलतार सिकुड़ता है


1
अगर मैं 1.0 और अंश को कुछ भी छोटा करता हूं, तो यह ग्राफ को सिकोड़ता है, रंगबार के आकार को प्रभावित नहीं करता है, जब तक कि अंश को बदलने से यह ठीक वही हो जाता है जो मेरे पास पहले से है, जिस बिंदु पर उन्हें बदलना कुछ भी करना बंद कर देता है।
इलियट

जहां आप वास्तव में उन्हें निर्दिष्ट कर रहे हैं कि वे colorbar()फ़ंक्शन या विधि के लिए पैरामीटर हैं ।
स्टीव बार्न्स

धन्यवाद। बस हटना पैरामीटर निर्दिष्ट करने की आवश्यकता है और यह जादू की तरह काम करता है!
कोडिंगनॉ

11

उपरोक्त सभी समाधान अच्छे हैं, लेकिन मुझे @ स्टीव्स और @ बेजोटा पसंद हैं क्योंकि वे फैंसी कॉल को शामिल नहीं करते हैं और सार्वभौमिक हैं।

सार्वभौमिक से मेरा मतलब है कि किसी भी प्रकार की कुल्हाड़ियों के साथ काम करता है 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वांछित परिणाम पर्याप्त उत्पादन नहीं करते।
फी याओ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.