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:
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!
3 Réponses :
Vous devez utiliser colLabels
pour nommer les colonnes et utiliser cellText
avec une forme correspondante
length = 1
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)
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')
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 >
Merci d'avoir fait des efforts et d'utiliser une méthode facile à suivre pour en savoir plus sur la table matplotlib.
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.
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']])
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 Lorsque je fais cela, j'obtiens quelque chose comme ce qui suit: 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()