2013-05-17 8 views
6

Matplotlib का make_axes_locatable उपकरण आपको मौजूदा अक्ष के किनारे एक नई अक्ष को संभालने की अनुमति देता है। हालांकि, यह मूल धुरी का आकार बदलता है। इससे बचने का कोई रास्ता है क्या?मूल धुरी के आकार को बदलने के बिना विभाजक बनाएं?

import matplotlib.pyplot as pl 
from mpl_toolkits.axes_grid import make_axes_locatable 
import matplotlib.axes as maxes 


fig = pl.figure() 
ax1=pl.subplot(1,3,1) 
ax1.imshow([[0,1],[2,0]]) 
ax1.yaxis.set_visible(False) 
ax1.xaxis.set_visible(False) 
ax2=pl.subplot(1,3,2) 
ax2.imshow([[0,1],[2,0]]) 
ax2.yaxis.set_visible(False) 
ax2.xaxis.set_visible(False) 
ax3=pl.subplot(1,3,3) 
ax3.imshow([[0,1],[2,0]]) 
ax3.yaxis.set_visible(False) 
ax3.xaxis.set_visible(False) 
pl.subplots_adjust(wspace=0) 


divider = make_axes_locatable(ax1) 
cax1 = divider.new_horizontal(size=0.2, pad=0.0, pack_start=True, axes_class=maxes.Axes) 
pl.colorbar(ax1.images[0],cax=cax1) 
cax1.yaxis.set_label_position('left') 
cax1.yaxis.set_ticks_position('left') 
fig.add_axes(cax1) 

divider = make_axes_locatable(ax2) 
cax2 = divider.new_vertical(size=0.2, pad=0.0, pack_start=True, axes_class=maxes.Axes) 
fig.add_axes(cax2) 
pl.colorbar(ax2.images[0],cax=cax2,orientation='horizontal') 
# thin out the tick labels for visibility 
for t in cax2.xaxis.get_majorticklabels()[::2]: 
    t.set_visible(False) 


divider = make_axes_locatable(ax3) 
cax3 = divider.new_horizontal(size=0.2, pad=0.0, pack_start=False, axes_class=maxes.Axes) 
pl.colorbar(ax3.images[0],cax=cax3) 
fig.add_axes(cax3) 

image with missized parents

समस्या यह है कि subplots अब विभिन्न आकारों हैं:

नीचे एक पूर्ण उदाहरण समस्या दिखा और यह कैसे पुन: पेश करने के लिए है। मुझे लगता है कि बाएं और दाएं संकुचित हो गए हैं, लेकिन बीच अपरिवर्तित है।

उत्तर

2

मैं प्रत्येक रंगबार & के लिए नई अक्ष बनाने के लिए अपने कोड को संशोधित करके पैरेंट प्लॉट का आकार बदलने से बचने में सक्षम हूं, फिर प्रत्येक को मैन्युअल रूप से रखता हूं। यह थोड़ा और काम है, लेकिन मुझे लगता है कि यह उस परिणाम के करीब है जिसे आप ढूंढ रहे हैं। ध्यान दें कि भूखंडों की वास्तविक सौंदर्य उपस्थिति आपके से थोड़ी अलग है - शायद क्योंकि मैं matplotlib (1.2.1) का एक नवीनतम संस्करण उपयोग कर रहा हूं।

%pylab inline 
import matplotlib.pyplot as pl 

fig = pl.figure() 
ax1=pl.subplot(1,3,1) 
ax1.imshow([[0,1],[2,0]]) 
ax1.yaxis.set_visible(False) 
ax1.xaxis.set_visible(False) 
ax2=pl.subplot(1,3,2) 
ax2.imshow([[0,1],[2,0]]) 
ax2.yaxis.set_visible(False) 
ax2.xaxis.set_visible(False) 
ax3=pl.subplot(1,3,3) 
ax3.imshow([[0,1],[2,0]]) 
ax3.yaxis.set_visible(False) 
ax3.xaxis.set_visible(False) 
pl.subplots_adjust(wspace=0) 

#Give the colorbar its own axis to avoid resizing the parent axis: 
width = 0.02 
height = 0.38 
vertical_position = 0.32 
horizontal_position = 0.1 
axColor = pl.axes([horizontal_position, vertical_position, width, height]) #the new axis for first colorbar 
pl.colorbar(ax1.images[0],cax=axColor,orientation='vertical') 
axColor.yaxis.set_label_position('left') 
axColor.yaxis.set_ticks_position('left') 

#likewise for the other colorbars with appropriately adjusted positions/ orientations: 
horizontal_position= 0.38 
vertical_position = 0.29 
height = 0.03 
width = 0.26 
axColor2 = pl.axes([horizontal_position, vertical_position, width, height]) #the new axis for second colorbar 
pl.colorbar(ax2.images[0],cax=axColor2,orientation='horizontal') 
# thin out the tick labels for visibility 
for t in axColor2.xaxis.get_majorticklabels()[::2]: 
    t.set_visible(False) 

width = 0.02 
height = 0.38 
vertical_position = 0.32 
horizontal_position = 0.905 
axColor3 = pl.axes([horizontal_position, vertical_position, width, height]) #the new axis for third colorbar  
pl.colorbar(ax3.images[0],cax=axColor3,orientation='vertical') 

enter image description here

+0

"सौंदर्य" अंतर मेरा डिफ़ॉल्ट विन्यास आइटम की वजह से है; मेरे पास डिफ़ॉल्ट रूप से 'इंटरपोलेशन =' निकटतम 'सेट है। – keflavich

+0

यह सामान्य दृष्टिकोण काम करता प्रतीत होता है, लेकिन अगर यह हार्ड-कोड के बजाय चौड़ाई/ऊंचाई/लंबवत/क्षैतिज स्थिति उत्पन्न करने का कोई तरीका होता तो यह बेहतर होगा। – keflavich

संबंधित मुद्दे