2016-12-02 1 views
2

En raison de la nature de ce que je trace, je veux des sous-placettes semblables aux tables imbriquées. Je ne suis pas sûr de savoir comment poser la question clairement, donc je vais ajouter quelques photos à la place qui, je l'espère, illustrent le problème.Titre Matplotlib couvrant deux (ou un nombre quelconque de) colonnes de sous-placettes

Ce que j'ai:

Matplotlib graphs with title and axes titles

Ce que je veux:

Matplotlib graphs with title and axes titles AND wanted sub-titles

code actuel (raccourci) ressemble à ceci:

fig, axes = plt.subplots(nrows=5, ncols=4) 
fig.suptitle(title, fontsize='x-large') 
data0.plot(x=data0.x, y=data0.y, ax=axes[0,0],kind='scatter') 
data1.plot(x=data1.x, y=data1.y, ax=axes[0,1],kind='scatter') 
axes[0,0].set_title('title 0') 
axes[0,1].set_title('title 1') 

je peux » t comprendre comment définir un titre pour un xes [0,0] et [0,1] ensemble. Je ne trouve rien non plus dans la documentation. Je ne suis pas friand de fouiner avec des tables en latex pour y parvenir. Des pointeurs? Excuses si cela a été demandé auparavant, je n'ai pas pu trouver quelque chose, pas moins parce que je ne suis pas sûr de savoir comment nommer le problème!

+0

Dans vos images, il n'y a pas de tables. Où devraient aller les tables? – ImportanceOfBeingErnest

+0

http://stackoverflow.com/questions/25239933/how-to-add-title-to-subplots-in-matplotlib – Dadep

+0

@ImportanceOfBeingErnest Il ne s'agit pas de tables (?). J'ai fait la comparaison des tableaux juste pour donner l'idée de nestedness. Merci d'avoir rendu mes photos visibles! – OfOurOwn

Répondre

2

La définition du titre de la figure à l'aide de fig.suptitle() et des titres d'axes (sous-repères) à l'aide de ax.set_title() est plutôt simple. Pour définir un titre intermédiaire de colonne, il n'y a en effet pas d'option de construction.

Une façon de résoudre ce problème peut être d'utiliser un plt.figtext() aux positions appropriées. Il faut tenir compte de l'espace supplémentaire pour ce titre, par ex. en utilisant fig.subplots_adjust et trouver les positions appropriées de cette figure. Dans l'exemple ci-dessous, nous utilisons les cadres de délimitation des axes que le titre doit recouvrir pour trouver une position horizontale centralisée. La position verticale est une meilleure estimation.

import matplotlib.pyplot as plt 
import numpy as np 

x = np.arange(10) 
y = np.random.rand(10,8) 

colors=["b", "g", "r", "violet"] 
fig, axes = plt.subplots(nrows=2, ncols=4, sharex=True, sharey=True, figsize=(8,5)) 
#set a figure title on top 
fig.suptitle("Very long figure title over the whole figure extent", fontsize='x-large') 
# adjust the subplots, i.e. leave more space at the top to accomodate the additional titles 
fig.subplots_adjust(top=0.78)  

ext = [] 
#loop over the columns (j) and rows(i) to populate subplots 
for j in range(4): 
    for i in range(2): 
     axes[i,j].scatter(x, y[:,4*i+j], c=colors[j], s=25) 
    # each axes in the top row gets its own axes title 
    axes[0,j].set_title('title {}'.format(j+1)) 
    # save the axes bounding boxes for later use 
    ext.append([axes[0,j].get_window_extent().x0, axes[0,j].get_window_extent().width ]) 

# this is optional 
# from the axes bounding boxes calculate the optimal position of the column spanning title 
inv = fig.transFigure.inverted() 
width_left = ext[0][0]+(ext[1][0]+ext[1][1]-ext[0][0])/2. 
left_center = inv.transform((width_left, 1)) 
width_right = ext[2][0]+(ext[3][0]+ext[3][1]-ext[2][0])/2. 
right_center = inv.transform((width_right, 1)) 

# set column spanning title 
# the first two arguments to figtext are x and y coordinates in the figure system (0 to 1) 
plt.figtext(left_center[0],0.88,"Left column spanning title", va="center", ha="center", size=15) 
plt.figtext(right_center[0],0.88,"Right column spanning title", va="center", ha="center", size=15) 
axes[0,0].set_ylim([0,1]) 
axes[0,0].set_xlim([0,10]) 

plt.show() 

enter image description here