2017-12-18 2 views
1

Ich muss ein Tabellenchart in Python plotten und diese Tabelle als jpeg/png speichern. Dann benutze dieses Bild in der Mail. Das Problem ist, dass ich am oberen und unteren Rand des Diagramms Leerraum bekomme. Code benutzen ich dieses Ziel zu erreichen:Leerraum oben und unten Python matplotlib plot

nrows, ncols = len(df)+1, len(df.columns) 
hcell, wcell = 0.5, 1.5 
hpad, wpad = 0, 0 
fig, ax = plt.subplots(figsize=(ncols*wcell+wpad, nrows*hcell+hpad)) 

ax.axis('off') 
ax.axis('tight') 
ax.xaxis.set_visible(False) 
ax.yaxis.set_visible(False) 

ax.table(cellText=df.values, colLabels=df.columns, loc='center') 
fig.savefig('table1.png', bbox_inches='tight') 

Ausgang: tabular table Auch ich die Überschrift nach oben und von links Seite des Diagramms geben will. 'Ein Text ist hier' ist die Überschrift und die gelbe Linie zeigt, wo ich eine andere Überschrift haben möchte. Gewünschter Ausgang ohne zusätzlichen Leerraum auf der Oberseite. Desired

+1

Sie könnten uns ein funktionierendes Beispiel geben wollen, damit wir Ihren Fall, und arbeiten daran reproduzieren. – IMCoins

+0

Ich gab den Code. Daten, die man reproduzieren kann. –

+0

Die Antwort wurde gegeben wtf – IMCoins

Antwort

2

Eine Option besteht darin, die Begrenzungsbox der Tabelle als diejenige festzulegen, die beim Speichern der Figur verwendet werden soll.

from matplotlib import pyplot as plt 

fig, ax = plt.subplots() 

colums = ['col1', 'col2'] 
rows = ['row1', 'row2'] 
values = [[0, 1], [1, 0]] 
table = ax.table(cellText=values, colLabels=colums, rowLabels=rows, loc='center') 

ax.axis('off') 

fig.canvas.draw() 
bbox = table.get_window_extent(fig.canvas.get_renderer()) 
bbox_inches = bbox.transformed(fig.dpi_scale_trans.inverted()) 

fig.savefig('plop.png', bbox_inches=bbox_inches) 

plt.show() 

enter image description here

In diesem Fall sind die äußeren Leitungen croped sind, da die Leitung an beiden Seiten seiner Position erstreckt. Man kann noch ein wenig Polsterung um den Tisch herum hinzufügen. Z.B. haben 5 Pixel padding,

bbox = table.get_window_extent(fig.canvas.get_renderer()) 
bbox = bbox.from_extents(bbox.xmin-5, bbox.ymin-5, bbox.xmax+5, bbox.ymax+5) 
bbox_inches = bbox.transformed(fig.dpi_scale_trans.inverted()) 

enter image description here

+0

Danke, liebe dich. – IMCoins

0

Ich glaube nicht, dass Sie die weißen Räume über und unter Ihrem Tisch löschen können. Reading the documentation, haben Sie bereits die höchste, die Sie jemals erreichen werden.

bbox_inches: str oder Bbox, optional

Bbox in Zoll. Nur der angegebene Teil der Figur wird gespeichert. Wenn "eng", versuchen Sie, die enge Box der Figur herauszufinden. Wenn keine, speichere savefig.bbox

Allerdings habe ich ein funktionierendes Beispiel für Ihre richtig gesetzten Zeilen und Spalten gemacht. Hier ist der Code, der dem Bild folgt.

from matplotlib import pyplot as plt 

fig = plt.figure() 
ax = fig.add_subplot(1, 1, 1) 

colums = ['col1', 'col2'] 
rows = ['row1', 'row2'] 
values = [[0, 1], [1, 0]] 
ax.table(cellText=values, colLabels=colums, rowLabels=rows, loc='center') 

ax.axis('off') 
ax.xaxis.set_visible(False) 
ax.yaxis.set_visible(False) 

fig.savefig('plop.png', bbox_inches='tight') 

Result

Ich rate Ihnen Ihre Achse/Bild vollständig Einstellungen nach Ihr Grundstück gezogen einzustellen.

+0

Natürlich können Sie die weißen Räume loswerden, aber 'bbox_inches = 'tight' würde nicht zu viel für diesen Zweck helfen. Sobald die Frage ein [mcve] zeigt, gebe ich gerne eine Antwort, wie das geht. – ImportanceOfBeingErnest

+0

Ich bin gespannt, wie Sie es tun würden. Der einzige Weg, den ich finden könnte, um dies zu erreichen, ist die Verwendung einer [Bbox] (https://matplotlib.org/api/transformations.html#matplotlib.transforms.Bbox) Instanz, aber ich habe keine Zeit, seine Macht zu kapseln jetzt sofort.Ich wäre froh, wenn du nett genug wärst, mir eine direkte Nachricht mit den Optionen zu schicken, die ich mir ansehen sollte. – IMCoins

+0

Ok, ich nahm dein Beispiel und benutzte es als Antwort mit 'bbox_inches'. Es gibt natürlich auch andere Möglichkeiten, wie den Tisch genau so groß wie die Figur zu machen. – ImportanceOfBeingErnest