Ich verwende Matplotlibs PdfPages, um verschiedene Abbildungen und Tabellen aus abgefragten Daten zu zeichnen und ein Pdf zu generieren. Ich möchte Diagramme nach verschiedenen Abschnitten wie "Stufe 1", "Stufe 2" und "Stufe 3" gruppieren, indem ich im Wesentlichen Abschnittsüberschriften erstelle. Zum Beispiel kann ich in einem Jupyter-Notizbuch den Markdown der Zelle vornehmen und fett gedruckte Überschriften erstellen. Ich bin mir jedoch nicht sicher, wie ich mit PdfPages etwas Ähnliches machen soll. Eine Idee, die ich hatte, war, eine 1-Zellen-Tabelle mit dem Abschnittstitel zu generieren. Anstatt eine Tabelle mit 1 Zellen zu erstellen, enthält der Titel eine Zelle pro Zeichen.

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)

Dies führt zu folgender Ausgabe: Bildbeschreibung hier eingeben

Wenn jemand Vorschläge zum Erstellen von Abschnittsüberschriften oder zumindest zum Beheben des Zellenproblems in der von mir erstellten Tabelle hat, würde ich mich über Ihre Eingabe freuen. Vielen Dank!

1
Jane Sully 17 Jän. 2019 im 21:44

3 Antworten

Beste Antwort

Sie müssen colLabels verwenden, um die Spalten zu benennen, und cellText mit einer entsprechenden Form verwenden

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)

enter image description here

Tabelle mit mehreren Zeilen

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')

enter image description here

Um eine einzelne Zeile mit mehreren Spalten zu erhalten, beginnend mit 2 Zeilen, 7 Spalten

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)

enter image description here

Eine einzelne Spalte abrufen Verwenden Sie den obigen Code

length = 1

Produziert

enter image description here

2
Sheldore 17 Jän. 2019 im 20:39

Eine Tabelle erwartet zweidimensionales cellText. Das heißt, Die m -te Spalte der n -ten Zeile enthält den Inhalt cellText[n][m]. Wenn cellText=['Stage 1'], wird cellText[0][0] zu "S" ausgewertet, da es eine Zeile gibt und die Zeichenfolge darin als Spalten indiziert ist. Stattdessen möchten Sie wahrscheinlich verwenden

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

D.h. der gesamte Text als erste Spalte der ersten Zeile.

enter image description here


Nun scheint die zugrunde liegende Frage zu sein, wie man einen Abschnittstitel hinzufügt, und vielleicht ist die Verwendung einer Tabelle dafür nicht der beste Ansatz? Zumindest ein ähnliches Ergebnis könnte mit einem üblichen Text erzielt werden,

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()

enter image description here

0
ImportanceOfBeingErnest 17 Jän. 2019 im 20:23

Ich kann Ihre Frage falsch verstehen, aber wenn Ihr letztendliches Ziel darin besteht, mehrere Diagramme in PDF zu gruppieren, besteht eine Lösung darin, jedes Ihrer Diagramme zu einem subplot desselben figure zu machen. Beispielsweise:

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()

Wenn ich das mache, bekomme ich ungefähr Folgendes:

enter image description here

0
Bill M. 17 Jän. 2019 im 20:36