2016-12-02 2 views
2

Aufgrund der Natur dessen, was ich zeichne, möchte ich Untertabellen ähnlich wie verschachtelte Tabellen. Ich bin nicht sicher, wie ich die Frage klar stellen soll, also werde ich stattdessen einige Bilder hinzufügen, die ich hoffe, das Problem zu veranschaulichen.Matplotlib-Titel, der zwei (oder beliebig viele) Unterplot-Spalten überspannt

Was ich habe:

Matplotlib graphs with title and axes titles

Was ich will:

Matplotlib graphs with title and axes titles AND wanted sub-titles

Strom (verkürzt) Code sieht etwa so aus:

fig, axes = plt.subplots(nrows=5, ncols=4) 
fig.suptitle(title, fontsize='x-large') 
data0.plot(x=data0.x, y=data0.y, ax=axes[0,0],kind='scatter') 
data1.plot(x=data1.x, y=data1.y, ax=axes[0,1],kind='scatter') 
axes[0,0].set_title('title 0') 
axes[0,1].set_title('title 1') 

ich kann‘ t finde heraus, wie man einen Titel für a xes [0,0] und [0,1] zusammen. Ich kann auch nichts in der Dokumentation finden. Ich mag es nicht, mit Latextischen herumzulaufen, um das zu erreichen. Irgendwelche Zeiger?

Entschuldigung, wenn das schon einmal gefragt wurde, konnte ich nichts finden, nicht zuletzt weil ich mir nicht sicher bin, wie ich das Problem tatsächlich benennen soll!

+0

In Ihren Bildern gibt es keine Tabellen. Wohin sollten die Tische gehen? – ImportanceOfBeingErnest

+0

http://stackoverflow.com/questions/25239933/how-to-add-title-to-subplots-in-matplotlib – Dadep

+0

@ImportanceOfBeingErnest geht es nicht um Tabellen (?). Ich habe die Tabellen verglichen, nur um die Idee der Verschachtelung zu geben. Danke, dass du meine Bilder sichtbar gemacht hast! – OfOurOwn

Antwort

2

Das Festlegen des Zahlentitels mit fig.suptitle() und der Achsen (Unterplot) -Titel unter Verwendung von ax.set_title() ist ziemlich einfach. Um einen Zwischentitel zu setzen, gibt es in der Tat keine Einbaumöglichkeit.

Eine Möglichkeit, dieses Problem zu lösen, ist die Verwendung eines plt.figtext() an den entsprechenden Positionen. Man muss etwas zusätzlichen Platz für diesen Titel berücksichtigen, z.B. indem Sie fig.subplots_adjust verwenden und geeignete Positionen für diesen figtext finden. Im folgenden Beispiel verwenden wir die Begrenzungsrechtecke der Achsen, über die sich der Titel erstrecken soll, um eine zentralisierte horizontale Position zu finden. Die vertikale Position ist eine beste Schätzung.

import matplotlib.pyplot as plt 
import numpy as np 

x = np.arange(10) 
y = np.random.rand(10,8) 

colors=["b", "g", "r", "violet"] 
fig, axes = plt.subplots(nrows=2, ncols=4, sharex=True, sharey=True, figsize=(8,5)) 
#set a figure title on top 
fig.suptitle("Very long figure title over the whole figure extent", fontsize='x-large') 
# adjust the subplots, i.e. leave more space at the top to accomodate the additional titles 
fig.subplots_adjust(top=0.78)  

ext = [] 
#loop over the columns (j) and rows(i) to populate subplots 
for j in range(4): 
    for i in range(2): 
     axes[i,j].scatter(x, y[:,4*i+j], c=colors[j], s=25) 
    # each axes in the top row gets its own axes title 
    axes[0,j].set_title('title {}'.format(j+1)) 
    # save the axes bounding boxes for later use 
    ext.append([axes[0,j].get_window_extent().x0, axes[0,j].get_window_extent().width ]) 

# this is optional 
# from the axes bounding boxes calculate the optimal position of the column spanning title 
inv = fig.transFigure.inverted() 
width_left = ext[0][0]+(ext[1][0]+ext[1][1]-ext[0][0])/2. 
left_center = inv.transform((width_left, 1)) 
width_right = ext[2][0]+(ext[3][0]+ext[3][1]-ext[2][0])/2. 
right_center = inv.transform((width_right, 1)) 

# set column spanning title 
# the first two arguments to figtext are x and y coordinates in the figure system (0 to 1) 
plt.figtext(left_center[0],0.88,"Left column spanning title", va="center", ha="center", size=15) 
plt.figtext(right_center[0],0.88,"Right column spanning title", va="center", ha="center", size=15) 
axes[0,0].set_ylim([0,1]) 
axes[0,0].set_xlim([0,10]) 

plt.show() 

enter image description here

Verwandte Themen