Mise en forme de table Matplotlib

entrez la description de l'image iciImpossible de trouver dans la documentation comment augmenter la hauteur de ligne des cellules, car le texte lui-même est très étroit.

Toute aide avec le code est appréciée! Le formatage de Table ne semble pas être bien documenté...

    # Plot line width
    matplotlib.rc('lines', linewidth=3)

    ind = np.arange(len(overall))

    fig = pyplot.figure()
    ax = fig.add_subplot(211)
    ax.set_title('Overall Rating of Experience')
    ax.set_ylabel('Score (0-100)')

    # Plot data on chart
    plot1 = ax.plot(ind, overall)
    plot2 = ax.plot(ind, svc_avg)
    plot3 = ax.plot(ind, benchmark)

    ax.yaxis.grid(True, which='major', ls='-', color='#9F9F9F')
    ax.set_ylim([min(overall + svc_avg + benchmark) - 3, 100])
    ax.set_xlim([-.5,1.5])
    ax.get_xaxis().set_ticks([])
    ax.set_position([.25, .3, 0.7, 0.5])

    colLabels = ['July', 'August']
    rowLabels = ['Average', 'Service Average', 'Benchmark']
    cellText = [overall, svc_avg, benchmark]
    the_table = ax.table(cellText=cellText, rowLoc='right',
                         rowColours=colors, rowLabels=rowLabels,
                         colWidths=[.5,.5], colLabels=colLabels,
                         colLoc='center', loc='bottom')

EDIT: merci à Oz pour la réponse-boucler les propriétés de la table permet de modifier facilement la propriété height:

    table_props = the_table.properties()
    table_cells = table_props['child_artists']
    for cell in table_cells: cell.set_height(0.1)
21
demandé sur Brian Tompsett - 汤莱恩 2012-03-29 23:24:26

2 réponses

La documentation matplotlib indique

Ajoute une table aux axes actuels. Retourne un matplotlib.table.Tableau instance. Pour un contrôle plus fin des tables, utilisez la classe Table et ajoutez-la aux axes avec add_table ().

Vous pouvez faire ce qui suit, regardez les propriétés de votre table (c'est et objet appartenant à cette Table de classe):

print  the_table.properties() # hint it's a dictionary do: type(the_table.properties() <type 'dict'> 

Modifiez ce dictionnaire comme vous le voyez à droite, et mettez à jour votre table, avec:

the_table.update(giveHereYourDictionary)

Indice: si vous travailler avec IPython ou shell interactif il suffit de faire help (objectName), par exemple help(the_table) pour voir toutes les méthodes de l'objet. Cela devrait, espérons-le, fonctionner.

OK, j'ajoute ici une promenade à travers Comment à ce genre de choses. J'admets que ce n'est pas trivial, mais j'utilise matplotlib depuis 3,5 ans maintenant, donc ...

Faites votre code dans IPython (Je l'ai déjà dit, Mais je dois le souligner à nouveau), cela aide vraiment à examiner toutes les propriétés des objets (tapez le nom de l'objet puis le la clé):

In [95]: prop=the_table.properties()
In [96]: prop #This is a dictionary, it's not so trivial, but never the less one can understand how dictionaries work...
Out[96]: 
{'agg_filter': None,
 'alpha': None,
 'animated': False,
 'axes': <matplotlib.axes.AxesSubplot at 0x9eba34c>,
 'celld': {(0, -1): <matplotlib.table.Cell at 0xa0cf5ec>,
  (0, 0): <matplotlib.table.Cell at 0xa0c2d0c>,
  (0, 1): <matplotlib.table.Cell at 0xa0c2dec>,
  (0, 2): <matplotlib.table.Cell at 0xa0c2ecc>,
  (1, -1): <matplotlib.table.Cell at 0xa0cf72c>,
  (1, 0): <matplotlib.table.Cell at 0xa0c2fac>,
  (1, 1): <matplotlib.table.Cell at 0xa0cf08c>,
  (1, 2): <matplotlib.table.Cell at 0xa0cf18c>,
  (2, -1): <matplotlib.table.Cell at 0xa0cf84c>,
  (2, 0): <matplotlib.table.Cell at 0xa0cf28c>,
  (2, 1): <matplotlib.table.Cell at 0xa0cf3ac>,
  (2, 2): <matplotlib.table.Cell at 0xa0cf4cc>},
 'child_artists': [<matplotlib.table.Cell at 0xa0c2dec>,
  <matplotlib.table.Cell at 0xa0cf18c>,
  <matplotlib.table.Cell at 0xa0c2d0c>,
  <matplotlib.table.Cell at 0xa0cf84c>,
  <matplotlib.table.Cell at 0xa0cf3ac>,
  <matplotlib.table.Cell at 0xa0cf08c>,
  <matplotlib.table.Cell at 0xa0cf28c>,
  <matplotlib.table.Cell at 0xa0cf4cc>,
  <matplotlib.table.Cell at 0xa0cf5ec>,
  <matplotlib.table.Cell at 0xa0c2fac>,
  <matplotlib.table.Cell at 0xa0cf72c>,
  <matplotlib.table.Cell at 0xa0c2ecc>],
 'children': [<matplotlib.table.Cell at 0xa0c2dec>,
  <matplotlib.table.Cell at 0xa0cf18c>,
  ...snip snap ...
  <matplotlib.table.Cell at 0xa0cf72c>,
  <matplotlib.table.Cell at 0xa0c2ecc>],
 'clip_box': TransformedBbox(Bbox(array([[ 0.,  0.],
       [ 1.,  1.]])), CompositeAffine2D(BboxTransformTo(Bbox(array([[ 0.,  0.],
       [ 1.,  1.]]))), BboxTransformTo(TransformedBbox(Bbox(array([[ 0.25,  0.3 ],
       [ 0.95,  0.8 ]])), BboxTransformTo(TransformedBbox(Bbox(array([[ 0.,  0.],
       [ 8.,  6.]])), Affine2D(array([[ 80.,   0.,   0.],
       [  0.,  80.,   0.],
       [  0.,   0.,   1.]])))))))),
 'clip_on': True,
 'clip_path': None,
 'contains': None,
 'figure': <matplotlib.figure.Figure at 0x9eaf56c>,
 'gid': None,
 'label': '',
 'picker': None,
 'rasterized': None,
 'snap': None,
 'transform': BboxTransformTo(TransformedBbox(Bbox(array([[ 0.25,  0.3 ],
       [ 0.95,  0.8 ]])), BboxTransformTo(TransformedBbox(Bbox(array([[ 0.,  0.],
       [ 8.,  6.]])), Affine2D(array([[ 80.,   0.,   0.],
       [  0.,  80.,   0.],
       [  0.,   0.,   1.]])))))),
 'transformed_clip_path_and_affine': (None, None),
 'url': None,
 'visible': True,
 'zorder': 0}

# we now get all the cells ...
 [97]: cells = prop['child_artists']

In [98]: cells
Out[98]: 
[<matplotlib.table.Cell at 0xa0c2dec>,
 <matplotlib.table.Cell at 0xa0cf18c>,
... snip snap...
 <matplotlib.table.Cell at 0xa0cf72c>,
 <matplotlib.table.Cell at 0xa0c2ecc>]

In [99]:cell=cells[0]
In [100]: cell # press tab here to see cell's attributes

Display all 122 possibilities? (y or n)
cell.PAD
cell.add_callback
...snip snap ...
cell.draw
cell.eventson
cell.figure
...snip snap ...
In [100]: cell.set_h
cell.set_hatch   cell.set_height 

# this looks promising no? Hell, I love python ;-)
wait, let's examine something first ...
In [100]: cell.get_height()
Out[100]: 0.055555555555555552
In [101]: cell.set_height(0.1) # we just 'doubled' the height...
In [103]: pyplot.show()

ET TA DA:

Table avec hauteur modifiée pour une cellule

Maintenant, je vous invite à changer la hauteur de toutes les cellules, en utilisant une boucle for. Ne devrait pas être si dur. Ce serait bien de gagner cette prime ; -)

30
répondu Oz123 2012-04-03 11:08:13

Vous pouvez également jouer avec la propriété bbox (bounding box) directement à l'appel de la fonction, ajoutez donc simplement l'argument bbox dans la méthode .table comme suit:

the_table = ax.table(cellText=cellText, rowLoc='right',
                     rowColours=colors, rowLabels=rowLabels,
                     colWidths=[.5,.5], colLabels=colLabels,
                     colLoc='center', loc='bottom',
                     bbox=[0, -0.3, 1, 0.275]) # <-- here is the magic

bbox est : [left, bottom, width, height]

Ainsi, vous pouvez mettre la table un peu plus bas (-0.3), et définir la hauteur à 0.275 (

Quoi Qu'il en soit, l'idée est que vous pouvez jouer avec bbox paramètre pour déplacer et ajuster votre table assez facilement (au moins plus facilement que la réponse acceptée)

Si votre table disparaît lors de l'enregistrement de la figure, vous pouvez réajuster la figure entière avec:

plt.tight_layout(rect=[0.11, 0.3, 0.95, .95])

Qui obéissent aux mêmes règles qu'une bbox (l, b, w, h). Ceci (0.3) laissera un peu d'espace pour la table sous la hache, et le 0.11 permettra au rowLabel de tenir dans la figure. Vous devrez jouer avec les valeurs afin qu'il semble le mieux pour vous.

Cela donne (j'utilise fig.add_suplot(111) btw):

Table Python Matplotlib

À titre de comparaison, le même chiffre sans changer les propriétés bbox:

Table Python Matplotlib mauvais

J'espère que cela aide.

9
répondu jrjc 2017-09-14 18:34:07