1
votes

Comment créer des en-têtes de tableau à 1 cellule avec Matplotlib?

J'utilise les PdfPages de Matplotlib pour tracer diverses figures et tableaux à partir de données interrogées et générer un Pdf. Je souhaite regrouper les graphiques par différentes sections telles que «Étape 1», «Étape 2» et «Étape 3», en créant essentiellement des en-têtes de section. Par exemple, dans un bloc-notes Jupyter, je peux effectuer le démarquage de la cellule et créer des en-têtes en gras. Cependant, je ne sais pas comment faire quelque chose de similaire avec PdfPages. Une idée que j'avais était de générer un tableau à 1 cellule contenant le titre de la section. Au lieu de créer un tableau à 1 cellule, il contient une cellule par caractère dans le titre.

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(12, 2))
ax = plt.subplot(111)
ax.axis('off')
tab = ax.table(cellText=['Stage 1'], bbox=[0, 0, 1, 1])
tab.auto_set_font_size(False)
tab.set_fontsize(24)

Cela donne le résultat suivant: entrez la description de l'image ici

Si quelqu'un a des suggestions sur la façon de créer des en-têtes de section ou au moins de résoudre le problème de cellule dans le tableau que j'ai créé, j'apprécierais votre contribution. Merci!


0 commentaires

3 Réponses :


3
votes

Vous devez utiliser colLabels pour nommer les colonnes et utiliser cellText avec une forme correspondante

length = 1

 entrez la description de l'image here

Tableau avec plusieurs lignes

tab = ax.table(cellText=[['']*length], colLabels=colLabels, bbox=[0, 0, 1, 1], cellLoc = 'center')
cells=tab.get_celld()

for i in range(length):
    cells[(1,i)].set_height(0)

 entrez la description de l'image ici a>

Pour obtenir une seule ligne avec plusieurs colonnes à partir de 2 lignes, 7 colonnes

cellText = np.random.randint(0, 10, (3,length)) # <--- 3 rows, 7 columns

tab = ax.table(cellText=cellText, colLabels=colLabels, bbox=[0, 0, 1, 1], cellLoc = 'center')

entrer l'image description here

Obtenir une seule colonne En utilisant le code ci-dessus

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(12, 2))
ax = plt.subplot(111)
ax.axis('off')

length = 7
colLabels = ['Stage %s' %i for i in range(1,length+1)] # <--- 1 row, 7 columns
cellText = np.random.randint(0, 10, (1,length))

tab = ax.table(cellText=cellText, colLabels=colLabels, bbox=[0, 0, 1, 1], cellLoc = 'center')
tab.auto_set_font_size(False)
tab.set_fontsize(14)

produit p >

 entrez la description de l'image ici


1 commentaires

Merci d'avoir fait des efforts et d'utiliser une méthode facile à suivre pour en savoir plus sur la table matplotlib.



0
votes

Une table attend un cellText bidimensionnel. C'est à dire. la m ème colonne de la n ème ligne a le contenu cellText [n] [m] . Si cellText = ['Étape 1'] , cellText [0] [0] évaluera à "S" , car il y a une ligne et la chaîne à l'intérieur est indexée en tant que colonnes. Au lieu de cela, vous voudrez probablement utiliser

import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(12, 2))
ax.tick_params(labelleft=False, left=False, labelbottom=False, bottom=False)
ax.annotate('Stage 1', (.5,.5), ha="center", va="center", fontsize=24)
plt.show()

i.e. le texte entier comme première colonne de la première ligne.

entrez la description de l'image ici


La question sous-jacente semble maintenant être de savoir comment ajouter un titre de section, et peut-être utiliser un tableau pour cela n'est pas la meilleure approche? Au moins un résultat similaire pourrait être obtenu avec un texte habituel,

ax.table(cellText=[['Stage 1']])

entrez la description de l'image ici


0 commentaires

0
votes

Je comprends peut-être mal votre question, mais si votre objectif ultime est de regrouper plusieurs parcelles en PDF, une solution consiste à faire de chacun de vos graphiques un sous-graphique du même chiffre . Par exemple:

import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages
import random

# Declare the PDF file and the single figure
pp = PdfPages('test.pdf')
thefig = plt.figure()
thefig.suptitle("Group 1")

# Generate 4 subplots for the same figure, arranged in a 2x2 grid
subplots = [ ["Plot One", 221], ["Plot Two", 222],
             ["Plot Three", 223], ["Plot Four", 224] ]
for [subplot_title, grid_position] in subplots:
    plt.subplot(grid_position)
    plt.title(subplot_title)
    # Make a random bar graph:
    plt.bar(range(1,11), [ random.random() for i in range(10) ])

# Add some spacing, so that the writing doesn't overlap
plt.subplots_adjust(hspace=0.35, wspace=0.35)

# Finish
pp.savefig()
pp.close()

Lorsque je fais cela, j'obtiens quelque chose comme ce qui suit:

 entrez la description de l'image ici


0 commentaires