labels - عناوين pyplot محاور ل subplots




matplotlib axes (3)

جواب Wen-wei Liao جيد إذا كنت لا تحاول تصدير الرسومات المتجهة أو أنك قمت بإعداد الخلفية الخاصة بك matplotlib لتجاهل محاور عديمة اللون؛ وإلا فستظهر المحاور المخفية في الرسم الذي تم تصديره.

إجابتي suplabel هنا مشابهة لـ fig.suptitle الذي يستخدم الدالة fig.text . لذلك لا يوجد فنان محاور يتم إنشاؤه وعديم اللون. ومع ذلك ، إذا حاولت الاتصال به عدة مرات ، فستحصل على نص مضاف أعلى الآخر (كما يفعل fig.suptitle أيضًا). جواب Wen-wei Liao لا ، لأن fig.add_subplot(111) سيعرض نفس كائن المحاور إذا كان قد تم إنشاؤه بالفعل.

يمكن أيضًا استدعاء وظيفتي بعد إنشاء المؤامرات.

def suplabel(axis,label,label_prop=None,
             labelpad=5,
             ha='center',va='center'):
    ''' Add super ylabel or xlabel to the figure
    Similar to matplotlib.suptitle
    axis       - string: "x" or "y"
    label      - string
    label_prop - keyword dictionary for Text
    labelpad   - padding from the axis (default: 5)
    ha         - horizontal alignment (default: "center")
    va         - vertical alignment (default: "center")
    '''
    fig = pylab.gcf()
    xmin = []
    ymin = []
    for ax in fig.axes:
        xmin.append(ax.get_position().xmin)
        ymin.append(ax.get_position().ymin)
    xmin,ymin = min(xmin),min(ymin)
    dpi = fig.dpi
    if axis.lower() == "y":
        rotation=90.
        x = xmin-float(labelpad)/dpi
        y = 0.5
    elif axis.lower() == 'x':
        rotation = 0.
        x = 0.5
        y = ymin - float(labelpad)/dpi
    else:
        raise Exception("Unexpected axis: x or y")
    if label_prop is None: 
        label_prop = dict()
    pylab.text(x,y,label,rotation=rotation,
               transform=fig.transFigure,
               ha=ha,va=va,
               **label_prop)

لدي المؤامرة التالية:

import matplotlib.pyplot as plt

fig2 = plt.figure()
ax3 = fig2.add_subplot(2,1,1)
ax4 = fig2.add_subplot(2,1,2)
ax4.loglog(x1, y1)
ax3.loglog(x2, y2)
ax3.set_ylabel('hello')

أريد أن أتمكن من إنشاء عناوين وعناوين محاور ليس فقط لكل من الخطوتين الجزئيتين ، بل أيضًا علامات مشتركة تمتد بين كل من خطوط فرعية. على سبيل المثال ، بما أن كلتا المؤامرات لها محاور متطابقة ، فأنا لا أحتاج سوى إلى مجموعة واحدة من تسميات x و axes. أنا لا أريد عناوين مختلفة لكل subplot رغم ذلك.

جربت بعض الأشياء ولكن لم يعمل أي منهم على حق


طريقة واحدة بسيطة باستخدام subplots :

import matplotlib.pyplot as plt

fig, axes = plt.subplots(3, 4, sharex=True, sharey=True)
# add a big axes, hide frame
fig.add_subplot(111, frameon=False)
# hide tick and tick label of the big axes
plt.tick_params(labelcolor='none', top='off', bottom='off', left='off', right='off')
plt.grid(False)
plt.xlabel("common X")
plt.ylabel("common Y")

يمكنك إنشاء وحدة فرعية كبيرة تغطي الخطوتين الجزئيتين ثم ضبط التسميات الشائعة.

import random
import matplotlib.pyplot as plt

x = range(1, 101)
y1 = [random.randint(1, 100) for _ in xrange(len(x))]
y2 = [random.randint(1, 100) for _ in xrange(len(x))]

fig = plt.figure()
ax = fig.add_subplot(111)    # The big subplot
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)

# Turn off axis lines and ticks of the big subplot
ax.spines['top'].set_color('none')
ax.spines['bottom'].set_color('none')
ax.spines['left'].set_color('none')
ax.spines['right'].set_color('none')
ax.tick_params(labelcolor='w', top='off', bottom='off', left='off', right='off')

ax1.loglog(x, y1)
ax2.loglog(x, y2)

# Set common labels
ax.set_xlabel('common xlabel')
ax.set_ylabel('common ylabel')

ax1.set_title('ax1 title')
ax2.set_title('ax2 title')

plt.savefig('common_labels.png', dpi=300)

هناك طريقة أخرى تستخدم fig.text () لتعيين مواقع التصنيفات الشائعة مباشرة.

import random
import matplotlib.pyplot as plt

x = range(1, 101)
y1 = [random.randint(1, 100) for _ in xrange(len(x))]
y2 = [random.randint(1, 100) for _ in xrange(len(x))]

fig = plt.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)

ax1.loglog(x, y1)
ax2.loglog(x, y2)

# Set common labels
fig.text(0.5, 0.04, 'common xlabel', ha='center', va='center')
fig.text(0.06, 0.5, 'common ylabel', ha='center', va='center', rotation='vertical')

ax1.set_title('ax1 title')
ax2.set_title('ax2 title')

plt.savefig('common_labels_text.png', dpi=300)