2017-04-05 3 views
2

Ich möchte einen Boxplot (Pandas) und die Regression der Mediane auf den gleichen Achsen plotten. Leider funktioniert es nicht wie erwartet. WederPlot Matplotlib Plot (Regression von Medianen) und Pandas Boxplot auf dem gleichen Diagramm

fig, ax = plt.subplots(ncols=1) 
data.boxplot(xxx, ax=ax) 
ax.plot(xreg, yreg) 

noch

fig, ax = plt.subplots(ncols=1) 
bplot = data.boxplot(xxx, ax=ax) 
bplot.plot(xreg, yreg) 

scheint zu funktionieren. enter image description here

Der letzte Ansatz scheint etwas besser zu funktionieren Das x passt nicht zusammen. Irgendwelche Ideen, was der Grund sein könnte und wie man die gleiche Skala ob beide Achse bekommt?

fig, ax = plt.subplots(ncols=1) 
ax1 = ax.twiny() 
bplot = data.boxplot(xxx, ax=ax) 
ax1.plot(xreg, yreg) 

enter image description here

Der Grund dafür ist wahrscheinlich die Skalierung der Achse:

ax.get_xlim() 
(0.5, 4.5) 

ax1.get_xlim() 
(-4.0, 84.0) 

Wenn ich nur die Regression plotten und die Mediane ohne boxplot, funktioniert alles einwandfrei:

enter image description here

+0

, was mit ihnen los? es ist unmöglich, dein Problem zu verstehen, ohne zu wissen, was du erwartest? Vielleicht sind Ihre Daten/Ergebnisse falsch –

+0

bearbeitet die Frage, um zu zeigen, wie die Daten aussehen sollten. Ich werde versuchen, ein funktionierendes Beispiel mit Spielzeugdaten zu machen – Moritz

+0

Also, wo ist das [MCVE]? – ImportanceOfBeingErnest

Antwort

3

Von l Bei der documentation of plt.boxplot finden wir, dass die Boxen standardmäßig bei den Indexpositionen 0,1,2, .. liegen. Die Achsengrenzen für N-Boxen sind somit [-0,5, N + 0,5].

Die Dokumentation sagt uns auch, dass die Positionen der Boxen mit dem positions Argument geändert werden können.

Mit diesem Argument können wir die Boxen an einer beliebigen Position entlang der x-Achse positionieren und dann möglicherweise ihre Breite anpassen, wenn ihre Trennung sehr groß oder klein wird.

Komplettes Beispiel:

import matplotlib.pyplot as plt 
import numpy as np 

x = np.linspace(0,70) 
f = lambda x: 6*np.exp(-x/50.) 

pos = [10, 40, 48, 64] 
a = np.empty((100,len(pos))) 
for i, p in enumerate(pos): 
    a[:,i] = np.random.normal(loc=f(p), size=a.shape[0]) 

plt.boxplot(a, positions=pos, widths=5) 
plt.plot(x, f(x)) 
plt.xlim(0,70) 

plt.show() 

enter image description here

Verwandte Themen