2016-04-08 9 views
1

Ich möchte zwei Pandas Datenrahmen innerhalb einer Figur als Boxplots darstellen. Da jeder der beiden Datenrahmen einen unterschiedlichen Wertebereich hat, möchte ich, dass sie in einer Twinx-Figur kombiniert werden.Kombiniere zwei Datenrahmen Boxplots in einer Twinx Figur

auf ein Minimum reduziert, habe ich versucht, die folgenden: (! 6 Boxen auf dem Grundstück sein sollte, tatsächlich gibt)

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 

df1 = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD')) 

df2 = pd.DataFrame(np.random.randint(100,200,size=(100, 2)), columns=list('EF')) 

fig, ax1 = plt.subplots() 
ax2 = ax1.twinx() 

df1.boxplot(ax=ax1) 
df2.boxplot(ax=ax2) 

plt.show() 

Das Ergebnis ist das, was erwartungsgemäß nicht wie

enter image description here aussehen sollte

Wie kann ich es schaffen, die Boxplots nebeneinander zu haben? Ich habe versucht, einige Streupunkte auf ax1 und ax2 zu setzen, aber das hat nicht wirklich geholfen.

+0

Können Sie ein Beispiel mit zufälligen Daten, die wir tatsächlich ausführen können? – Chiel

+1

Fertig, danke! – user3017048

Antwort

2

Die beste Lösung besteht darin, die Datenrahmen zum Plotten zu verketten und eine Maske zu verwenden. Bei der Erstellung der Maske verwenden wir die dfs == dfs | dfs.isnull(), um eine vollständige Matrix mit True zu erstellen, und dann fragen wir nach allen Spaltennamen, die nicht 'E' oder 'F' sind. Dies ergibt eine 2D-Matrix, die es Ihnen ermöglicht, nur die ersten vier Felder zu zeichnen, da die letzten beiden zwei maskiert sind (so dass ihre Ticks am unteren Rand erscheinen). Mit der inversen Maske ~mask zeichnen Sie die letzten beiden auf ihrer eigenen Achse und maskieren die ersten vier.

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 

df1 = pd.DataFrame(np.random.randint( 0,100,size=(100, 4)), columns=list('ABCD')) 
df2 = pd.DataFrame(np.random.randint(100,200,size=(100, 2)), columns=list('EF' )) 

dfs = pd.concat([df1, df2]) 
mask = ((dfs == dfs) | dfs.isnull()) & (dfs.columns != 'E') & (dfs.columns != 'F') 

fig, ax1 = plt.subplots() 
dfs[mask].boxplot() 

ax2 = ax1.twinx() 
dfs[~mask].boxplot() 

plt.show() 

The box plots

+0

Danke, es funktioniert super! – user3017048