2013-04-30 23 views
7

Ich zeichne den unten gezeigten Bloxplot mit Python und Matplotlib. Gibt es eine Möglichkeit, den Abstand zwischen den beiden Boxplots auf der X-Achse zu reduzieren?Reduzierung der Distanz zwischen zwei Boxplots

enter image description here

Dies ist der Code, den ich über die Figur bekommen bin mit:

import matplotlib.pyplot as plt 
from matplotlib import rcParams 
rcParams['ytick.direction'] = 'out' 
rcParams['xtick.direction'] = 'out' 

fig = plt.figure() 
xlabels = ["CG", "EG"] 
ax = fig.add_subplot(111) 
ax.boxplot([values_cg, values_eg]) 
ax.set_xticks(np.arange(len(xlabels))+1) 
ax.set_xticklabels(xlabels, rotation=45, ha='right') 
fig.subplots_adjust(bottom=0.3) 
ylabels = yticks = np.linspace(0, 20, 5) 
ax.set_yticks(yticks) 
ax.set_yticklabels(ylabels) 

ax.tick_params(axis='x', pad=10) 
ax.tick_params(axis='y', pad=10) 

plt.savefig(os.path.join(output_dir, "output.pdf")) 

Und dies ist ein Beispiel näher an, was ich visuell bekommen möchte (obwohl ich wenn die Boxplots miteinander hätte nichts dagegen, noch etwas näher waren):

enter image description here

Antwort

5

Versuchen Sie das Seitenverhältnis zu ändern mit

ax.set_aspect(1.5) # or some other float 

Je größer dann Zahl, desto schmaler (und höher) sollte die Handlung sein:

ein Kreis so gedehnt wird, dass die Höhe num mal die Breite. aspect=1 ist das gleiche wie aspect=’equal’.

http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.set_aspect

+0

Ich wählte dies als die Antwort, weil das Setzen des Aspekts wirklich das war, was ich vermisste, aber am Ende bedeutete die Lösung auch, die Breite der Kästchen zu ändern, wie in der Antwort von @ tcaswell. –

10

Sie können entweder ändern t er Seitenverhältnis von Grundstück oder verwenden Sie das widths kwarg (doc) als solche:

ax.boxplot([values_cg, values_eg], widths=1) 

an die Boxen zu verbreitern.

1

Wenn Ihr Code schreibt:

ax.set_xticks(np.arange(len(xlabels))+1) 

Sie die erste Box-Plot auf 0 und die zweite auf 1 setzen (event wenn Sie die Zecke Etiketten danach aus), genau wie in dem zweiten, "gewollten" Beispiel, das du gegeben hast, sind sie auf 1,2,3 gesetzt. Also ich denke, eine alternative Lösung wäre, mit der Xticks-Position und dem xlim der Handlung zu spielen.

zum Beispiel unter Verwendung von

ax.set_xlim(-1.5,2.5) 

würde sich näher platzieren.

+1

Dies war der erste Ansatz, den ich versucht habe, aber ohne viel Glück. Ich denke der Grund ist, dass der Abstand zwischen Ticks immer relativ zum verfügbaren Platz ist. Wenn ich also die Ticks näher an den Ursprung verschiebe, wird rechts mehr Platz zur Verfügung stehen, und der Plot wird ebenfalls "herangezoomt", um den verfügbaren Platz einzunehmen. Wie bei "xlim()" erlaubt es nur, den Raum von den Ticks bis zum Ursprung zu steuern, nicht den Abstand zwischen Ticks. –

Verwandte Themen