Eu tenho o seguinte enredo:
fig,ax = plt.subplots(5,2,sharex=True,sharey=True,figsize=fig_size)
e agora gostaria de fornecer a esse gráfico rótulos comuns do eixo xe do eixo y. Com "comum", quero dizer que deve haver um grande rótulo do eixo x abaixo de toda a grade de subtramas e um grande rótulo do eixo y à direita. Não consigo encontrar nada sobre isso na documentação plt.subplots
, e minhas pesquisas sugerem que eu preciso fazer um grande investimento plt.subplot(111)
para começar - mas como faço para colocar minhas subparcelas 5 * 2 nisso plt.subplots
?
python
matplotlib
jolindbe
fonte
fonte
Respostas:
Parece com o que você realmente deseja. Aplica a mesma abordagem desta resposta ao seu caso específico:
fonte
plt.text
. Você cria suas subparcelas, mas depois adiciona uma plotagem de bit, torna-a invisível e rotula seus x e y.tight_layout
?tight_layout
substituição0.04
por0
parece funcionar.fig.text
não é uma boa ideia. Este mexe-se coisas comoplt.tight_layout()
Como considero relevante e elegante o suficiente (não há necessidade de especificar coordenadas para colocar o texto), copio (com uma leve adaptação) uma resposta para outra pergunta relacionada .
Isso resulta no seguinte (com matplotlib versão 2.2.0):
fonte
constrained_layout=True
porque cria etiquetas sobrepostas. Nesse caso, você deve ajustar manualmente as bordas das subparcelas.Sem
sharex=True, sharey=True
você ter:Com ele, você deve ficar mais agradável:
Mas se você quiser adicionar outros rótulos, adicione-os apenas às plotagens de borda:
A adição de etiquetas para cada plotagem a prejudicaria (talvez haja uma maneira de detectar automaticamente etiquetas repetidas, mas não conheço uma).
fonte
Desde o comando:
você usou retorna uma tupla composta pela figura e uma lista das instâncias dos eixos, já é suficiente fazer algo como (lembre-se de que mudei
fig,ax
parafig,axes
):Se você desejar alterar alguns detalhes de uma subparcela específica, poderá acessá-la através de
axes[i]
ondei
itera suas subparcelas.Também pode ser muito útil incluir um
no final do arquivo, antes do
plt.show()
, para evitar sobreposição de rótulos.fonte
plt.subplots()
, criará uma nova instância de figura. Se você deseja seguir esse comando, pode adicionar facilmente abig_ax = fig.add_subplot(111)
, pois você já tem uma figura e pode adicionar outro eixo. Depois disso, você pode manipularbig_ax
a maneira como é mostrado no link de Hooked.none
fazendo:big_ax.set_axis_bgcolor('none')
Você também deve criar a cor da etiquetanone
(em oposição ao exemplo vinculado por Hooked):big_ax.tick_params(labelcolor='none', top='off', bottom='off', left='off', right='off')
AttributeError: 'numpy.ndarray' object has no attribute 'set_xlabel'
na declaraçãoax.set_xlabel('Common x-label')
. Você pode descobrir isso?Ficará melhor se você reservar espaço para os rótulos comuns, criando rótulos invisíveis para a subparcela no canto inferior esquerdo. Também é bom passar o tamanho da fonte do rcParams. Dessa forma, os rótulos comuns mudarão de tamanho com sua configuração de rc e os eixos também serão ajustados para deixar espaço para os rótulos comuns.
fonte
Encontrei um problema semelhante ao traçar uma grade de gráficos. Os gráficos consistiam em duas partes (superior e inferior). O rótulo y deveria estar centrado nas duas partes.
Eu não queria usar uma solução que dependesse de conhecer a posição na figura externa (como fig.text ()), então manipulei a posição y da função set_ylabel (). Geralmente é 0,5, no meio do gráfico ao qual é adicionado. Como o preenchimento entre as partes (hspace) no meu código era zero, eu pude calcular o meio das duas partes em relação à parte superior.
cenário
Desvantagens:
A distância horizontal ao gráfico é baseada na parte superior, os marcadores inferiores podem se estender para o rótulo.
A fórmula não leva em consideração o espaço entre as partes.
Lança uma exceção quando a altura da parte superior é 0.
Provavelmente existe uma solução geral que leva em consideração o preenchimento entre os números.
fonte
Atualizar:
Esse recurso agora faz parte do pacote proplot matplotlib que eu liberei recentemente no pypi. Por padrão, quando você cria figuras, os rótulos são "compartilhados" entre os eixos.
Resposta original:
Eu descobri um método mais robusto:
Se você conhece o
bottom
etop
kwargs que foramGridSpec
iniciados, ou conhece as posições das arestas dos seus eixos emFigure
coordenadas , também pode especificar a posição do marcador emFigure
coordenadas com alguma mágica "transformada" sofisticada. Por exemplo:... e você deve ver que o rótulo ainda se ajusta de maneira adequada à esquerda e à direita para não se sobrepor aos ticklabels, como normalmente - mas agora ele será ajustado para estar sempre exatamente entre as subparcelas desejadas.
Além disso, se você nem usar
set_position
, o rótulo será exibido por padrão exatamente na metade da figura . Suponho que isso ocorre porque, quando o rótulo é finalmente desenhado,matplotlib
usa 0,5 para oy
-coordinate sem verificar se a transformação de coordenadas subjacente foi alterada.fonte