Você pode criar uma grande sub-plot que cubra as duas sub-plot e depois defina os rótulos comuns.
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=False, bottom=False, left=False, right=False)
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)
Outra maneira é usar fig.text () para definir os locais dos rótulos comuns diretamente.
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)
ax
deve ser criado antesax1
eax2
, caso contrário, o grande enredo encobrirá os pequenos enredos.Uma maneira simples de usar
subplots
:fonte
'off'
paraFalse
com as versões mais recentes do Matplotlib (tenho 2.2.2)for ax in axes: ax.plot(x, y)
não parece fazer nenhum bem.A resposta de Wen-wei Liao é boa se você não está tentando exportar gráficos vetoriais ou se configurou os back-ends do matplotlib para ignorar os eixos incolores; caso contrário, os eixos ocultos apareceriam no gráfico exportado.
Minha resposta
suplabel
aqui é semelhante àfig.suptitle
que usa afig.text
função. Portanto, não há artista de eixos sendo criado e tornado incolor. No entanto, se você tentar chamá-lo várias vezes, você adicionará texto um sobre o outro (comofig.suptitle
também). A resposta de Wen-wei Liao não, porquefig.add_subplot(111)
retornará o mesmo objeto Axes se ele já estiver criado.Minha função também pode ser chamada após a criação dos gráficos.
fonte
Aqui está uma solução em que você define o rótulo de uma das plotagens e ajusta a posição da mesma para que fique centralizada verticalmente. Dessa forma, você evita os problemas mencionados pela KYC.
fonte
plt.setp()
fará o trabalho:fonte
fonte
Os métodos nas outras respostas não funcionarão corretamente quando os yticks forem grandes. O rótulo será sobreposto com carrapatos, será cortado à esquerda ou completamente invisível / fora da figura.
Modifiquei a resposta de Hagne para que funcione com mais de uma coluna de subparcelas, para xlabel e ylabel, e muda o gráfico para manter o rótulo visível na figura.
Ele funciona no exemplo a seguir, enquanto a resposta de Hagne não desenha o rótulo de rótulo (já que está fora da tela) e o rótulo de rótulo do KYC se sobrepõe aos rótulos de tick:
Como alternativa, se você estiver bem com o eixo incolor, modifiquei a solução de Julian Chen para que o ylabel não se sobreponha aos rótulos dos tiquetaques.
Basicamente, basta definir os ylims do incolor para que ele corresponda aos maiores ylims das subparcelas, para que os rótulos de marca incolor definam o local correto para o rótulo.
Novamente, temos que reduzir o gráfico para evitar cortes. Aqui, eu codifiquei a quantidade a encolher, mas você pode procurar um número que funcione para você ou calculá-lo como no método acima.
fonte