2013-10-09 7 views
16

साजिश में मेरे पास दो स्कैटर प्लॉट हैं जिनमें अलग-अलग संख्या स्केल हैं, इसलिए उनके वाई-अक्ष लेबल को गठबंधन नहीं किया गया है। क्या वाई-अक्ष लेबल में क्षैतिज संरेखण को मजबूर करने का कोई तरीका है?matplotlib: स्टैक्ड स्कैटर प्लॉट्स में वाई-अक्ष लेबल को संरेखित करना

import matplotlib.pylab as plt 
import random 
import matplotlib.gridspec as gridspec 

random.seed(20) 
data1 = [random.random() for i in range(10)] 
data2 = [random.random()*1000 for i in range(10)] 

gs = gridspec.GridSpec(2,1) 
fig = plt.figure() 

ax = fig.add_subplot(gs[0]) 
ax.plot(data1) 
ax.set_ylabel(r'Label One', size =16) 

ax = fig.add_subplot(gs[1]) 
ax.plot(data2) 
ax.set_ylabel(r'Label Two', size =16) 

plt.show() 

stacked scatter plots

+0

जो आप यहां वर्णित करना चाहते हैं: http://matplotlib.org/faq/howto_faq।एचटीएमएल # संरेखण-my-ylabels-over-multiple-subplots –

उत्तर

18

आप set_label_coords विधि का उपयोग कर सकते हैं।

import matplotlib.pylab as plt 
import random 
import matplotlib.gridspec as gridspec 

random.seed(20) 
data1 = [random.random() for i in range(10)] 
data2 = [random.random()*1000 for i in range(10)] 

gs = gridspec.GridSpec(2,1) 
fig = plt.figure() 

ax = fig.add_subplot(gs[0]) 
ax.plot(data1) 
ax.set_ylabel(r'Label One', size =16) 
ax.get_yaxis().set_label_coords(-0.1,0.5) 

ax = fig.add_subplot(gs[1]) 
ax.plot(data2) 
ax.set_ylabel(r'Label Two', size =16) 
ax.get_yaxis().set_label_coords(-0.1,0.5) 

enter image description here

+0

धन्यवाद! मैं "ax.get_yaxis()। Get_label()। Set_ha ('left')" के साथ कुछ करने की कोशिश कर रहा था, लेकिन यह काम नहीं किया। मुझे लगता है कि मुझे पूरी तरह से समझ में नहीं आया कि लेबल संरेखण कैसे काम करते हैं। – dimka

+3

क्या * स्वचालित रूप से * निर्धारित करने का कोई तरीका है कि दोनों अक्षों पर टिक लेबल से न्यूनतम स्वीकार्य दूरी क्या है? अर्थात। यह जानने के लिए कि स्वतंत्र स्वचालित स्थिति क्या होगी, फिर स्पष्ट रूप से उन्हें सबसे बड़े के बराबर सेट करें? – andybuckley

+3

@andybuckley, मैंने बस लेबल को स्वचालित रूप से संरेखित करने के साथ खेला। आप 'ax.yaxis.label.get_position()' का उपयोग कर पदों के न्यूनतम/अधिकतम मान प्राप्त कर सकते हैं, लेकिन समन्वय स्थान समान नहीं है जैसा कि 'ax.yaxis.set_label_coords()' में उपयोग किया जाता है - आपके पास है 'ax.yaxis.label.set_position()' और एक हैक का थोड़ा उपयोग करने के लिए: 'ax.yaxis._autolabelpos = गलत 'या अन्यथा जब आप' draw() ' –

2

टिप्पणी में तैनात रूप में, आप के लिए described here रूप set_label_coords() का उपयोग कर हल किया जाता है क्या देख रहे हैं। आपके मामले के लिए यह होगा की तरह कुछ:

labelx = -0.5 

ax = fig.add_subplot(gs[0]) 
ax.plot(data1) 
ax.set_ylabel(r'Label One', size=16) 
ax.yaxis.set_label_coords(labelx, 0.5) 

ax = fig.add_subplot(gs[1]) 
ax.plot(data2) 
ax.set_ylabel(r'Label Two', size=16) 
ax.yaxis.set_label_coords(labelx, 0.5) 
1

यहाँ एक समारोह मैं अपने आप लेबल संरेखित के लिए लिखा है, लेकिन यह एक स्क्रिप्ट में काम करने के लिए, केवल सहभागी नहीं लगता है।

def align_labels(axes_list,axis='y',align=None): 
    if align is None: 
     align = 'l' if axis == 'y' else 'b' 
    yx,xy = [],[] 
    for ax in axes_list: 
     yx.append(ax.yaxis.label.get_position()[0]) 
     xy.append(ax.xaxis.label.get_position()[1]) 

    if axis == 'x': 
     if align in ('t','top'): 
      lim = max(xy) 
     elif align in ('b','bottom'): 
      lim = min(xy) 
    else: 
     if align in ('l','left'): 
      lim = min(yx) 
     elif align in ('r','right'): 
      lim = max(yx) 

    if align in ('t','b','top','bottom'): 
     for ax in axes_list: 
      t = ax.xaxis.label.get_transform() 
      x,y = ax.xaxis.label.get_position() 
      ax.xaxis.set_label_coords(x,lim,t) 
    else: 
     for ax in axes_list: 
      t = ax.yaxis.label.get_transform() 
      x,y = ax.yaxis.label.get_position() 
      ax.yaxis.set_label_coords(lim,y,t) 

और एक उदाहरण:

fig,ax = subplots(2,2) 
ax00,ax01 = ax[0] 
ax10,ax11 = ax[1] 
ax00.set_ylim(1000,5000) 
ax00.set_ylabel('top') 
ax10.set_ylabel('bottom') 
ax10.set_xlabel('left') 
ax11.set_xlabel('right') 
ax11.xaxis.axis_date() 
fig.autofmt_xdate() 
#we have to call draw() so that matplotlib will figure out the automatic positions 
fig.canvas.draw() 
align_labels(ax[:,0],'y') 
align_labels(ax[1],'x') 

example figure

0

मैं अंत में एक समाधान प्रदान, लेकिन पहले मैं जो तरीका सफलता के लिए नेतृत्व नहीं करता है बताओ।

मैं हाल ही में इस मुद्दे पर दोबारा गौर किया है, और, विभिन्न समाधान की कोशिश कर रहा अर्थात लगभग सभी समन्वय प्रणाली अलग के बीच परिवर्तनों के संभव संयोजनों की कोशिश कर रहा है, और tight_layout() के साथ अपने रिश्ते के साथ काफी कुछ समय बिताया। मैंने केवल backend_pdf के साथ प्रयोग किया, इसलिए मैं इंटरैक्टिव मीडिया के बारे में नहीं बता सकता। लेकिन संक्षेप में, मेरा निष्कर्ष यह है कि इससे कोई फर्क नहीं पड़ता कि आप पदों को खोजने और उन्हें बदलने की कोशिश कैसे करते हैं, अक्ष स्तरों को संरेखित करने के लिए इस स्तर पर संभव नहीं है। मुझे लगता है कि किसी भी तरह से यह संभव होना चाहिए, उदाहरण के लिए आंतरिक रूप से matplotlib subplots के अक्षों को संरेखित करने में सक्षम है। केवल पीडीएफ फाइल में दो बार ड्राइंग और inbetween नीचे की तरह कुछ कर रही के साथ, मैं बेहतर स्थान प्राप्त कर सकते थे, लेकिन अभी भी गठबंधन नहीं:

# sorry for the `self`, this is from a class 
def align_x_labels(self): 
    self.lowest_ax = min(self.axes.values(), 
         key = lambda ax: ax.xaxis.label.get_position()[1]) 
    self.lowest_xlab_dcoo = self.lowest_ax.transData.transform(
     self.lowest_ax.xaxis.label.get_position()) 
    list(
     map(
       lambda ax: \ 
        ax.xaxis.set_label_coords(
         self.fig.transFigure.inverted().transform(
          ax.transAxes.transform((0.5, 0.5)))[0], 
         self.fig.transFigure.inverted().transform(
          self.lowest_xlab_dcoo)[1], 
         transform = self.fig.transFigure 
        ), 
       self.axes.values() 
      ) 
    ) 

यह एक शर्म की बात है इस तरह के एक बुनियादी कार्यक्षमता हासिल नहीं किया जा सकता है, और यह है अस्पष्ट कैसे विभिन्न समन्वय रिक्त स्थान बदल रहे हैं और साजिश के विभिन्न चरणों में कैसे रद्द किया गया है। मैं इसकी स्पष्ट व्याख्या देखने के लिए बहुत सराहना करता हूं, क्योंकि matplotlib webpage केवल आर्किटेक्चर को रेखांकित करता है, सरल मामलों को प्रस्तुत करता है, लेकिन इस तरह की स्थितियों को समझाने में विफल रहता है। इसके अलावा मुझे आश्चर्य है कि समन्वय स्वीकार करने या वापस करने के तरीके उनके डॉक्टरों में नहीं बताते हैं कि किस तरह के निर्देशांक हैं। अंत में मुझे बहुत उपयोगी this tutorial मिला।

समाधान

अंत में, बजाय परिवर्तनों के साथ खिलवाड़ की, मैं GridSpec शून्य ऊंचाई और अदृश्य कुल्हाड़ियों (समान के लिए एक अतिरिक्त पंक्ति y अक्ष लेबल के लिए एक शून्य चौड़ाई स्तंभ के साथ किया जा सकता है में बनाया)। फिर मैंने इन सबप्लॉट्स के लिए लेबल जोड़े, verticalalignment को top पर सेट किया।

# get one of the zero height phantom subplots to `self.ax`: 
self.get_subplot(i, 1) 
# set empty ticklabels: 
self.ax.xaxis.set_ticklabels([]) 
self.ax.yaxis.set_ticklabels([]) 
# set the axis label: 
self.ax.set_xlabel(labtext, fontproperties = self.fp_axis_lab) 
# and this is matter of aesthetics 
# sometimes bottom or center might look better: 
self.ax.xaxis.label.set_verticalalignment('top') 
संबंधित मुद्दे