2015-08-01 7 views
5

Ich würde gerne fragen, wie ich eine Seaborn Figur in wxPython Panel einbetten könnte.Embedding Seaborn Grundstück in WxPython Panel

Ähnlich wie diese post, ich möchte eine externe Figur in einem wxPython Panel einbetten. Ich möchte ein spezifisches Panel meiner wxPython GUI haben, um die Dichtekonturen meiner Daten basierend auf Bandbreitenwerten eines Gaußschen Kerns gemäß Seaborns kdeplot Funktion zusammen mit einem Punktdiagramm der Datenpunkte zu plotten. Hier ist ein Beispiel dafür, was Ich mag in der Platte werden aufgetragen würde: example

Bisher habe ich es geschafft zu bekommen, was ich in einer separaten Figur wollen aus den wxPython panel.Is es möglich, ein Seaborn Grundstück einzubetten in einem wxPython Panel oder sollte eine alternative Möglichkeit finden zu implementieren, was ich will?

Unten ist der spezifische Teil meines Code, den das Grundstück für den Fall erzeugt es gebraucht wird:

import seaborn as sns 
import numpy as np 

fig = self._view_frame.figure 

data = np.loadtxt(r'data.csv',delimiter=',') 
ax = fig.add_subplot(111) 
ax.cla() 
sns.kdeplot(data, bw=10, kernel='gau', cmap="Reds") 
ax.scatter(data[:,0],data[:,1], color='r') 

fig.canvas.draw() 

Dieser Teil des Code Plots im WxPython Panel die verstreuten Datenpunkten und schafft eine externe Figur für die Dichte Konturen. Aber, wenn ich ax.sns.kdeplot(...) versuchen erhalte ich die Fehler

Attribute Error: AxesSubplot object has not attribute .sns

Ich weiß nicht, ob ich eine Seaborn Figur in wxPython Panel einbetten können oder sollte ich es auf eine andere Weise versuchen umzusetzen. Irgendwelche Vorschläge?

Vielen Dank im Voraus.

+1

Seaborn ('sns') verwendet MPL, aber es ist eine völlig separate Bibliothek. "ax.sns" ergibt keinen Sinn. Sie möchten "ax" an die Funktion "sns.kdeplot" übergeben. –

+0

Ich tat genau das und es funktioniert wie ein Charme. Ich bemerkte auf der Funktionsseite (http://stanford.edu/~mwaskom/software/seaborn/generated/seaborn.kdeplot.html), dass es einen solchen Parameter akzeptiert. Genauer gesagt zeigt der "ax" -Parameter die ** Achse ** zum Plotten an. Also, in meinem Fall habe ich mich mit meinem Problem beschäftigt, indem ich folgendes gemacht habe: 'sns.kdeplot (Daten, ** ax = ax **, bw = 10, kernel = 'gau', cmap =" Reds ")'. Vielen Dank :). – user3204834

Antwort

2

Ich weiß nichts über wxPython, aber wenn Sie auf eine bestimmte Achse plotten möchten, verwenden Sie das Schlüsselwort ax.

+0

Tatsächlich habe ich auf der Funktion [Seite] (http://stanford.edu/~mwaskom/software/seaborn/generated/seaborn.kdeplot.html) nicht bemerkt, dass es einen solchen Parameter akzeptiert. Wie man sehen kann, 'seaborn.kdeplot (Daten, Daten2 = Keine, Schatten = Falsch, Vertikal = Falsch, Kern = 'Gau', Bw = 'Scott', Rastergröße = 100, Ausschneiden = 3, Clip = Keine, Legende = Wahr, kumulativ = Falsch, Schatten_niedrig = True, ** ax = None **, ** kwargs) 'Der' ax'-Parameter zeigt die ** Achse ** zum Plotten an. Also, in meinem Fall habe ich mich mit meinem Problem beschäftigt, indem ich folgendes gemacht habe: 'sns.kdeplot (Daten, ** ax = ax **, bw = 10, kernel = 'gau', cmap =" Reds ")'. Danke für Ihre Hilfe :). – user3204834

2

Ich habe Seaborn nie benutzt, aber da das Dokument sagt "Seaborn ist eine Python-Visualisierungsbibliothek basierend auf Matplotlib", können Sie wahrscheinlich die MPL-Klasse namens FigureCanvasWxAgg verwenden.

Hier ist ein Beispielcode zum Einbetten einer MPL-Figur in wxPython.

import numpy as np 
import wx 

import matplotlib 
matplotlib.use('WXAgg') 
from matplotlib.figure import Figure 
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg 

import seaborn 

class test(wx.Frame): 

    def __init__(self): 

     wx.Frame.__init__(self, None, title='Main frame') 

     # just a normal MPL "Figure" object 
     figure = Figure(None) 
     # Place a widget to hold MPL figure. no sizer because this is the only widget 
     fc = FigureCanvasWxAgg(self, -1, figure) 

     # your plotting code here, this can be sns calls i think 
     subplot = figure.add_subplot(111) 
     subplot.plot(np.arange(10)) 

     # Lastly show them 
     self.Show() 


if __name__ == '__main__': 

    app = wx.App(0) 
    testframe = test() 
    app.MainLoop() 

Sie könnten wahrscheinlich das Plotten Code mit sns Sachen ersetzen Sie einfach und nur sicherstellen, dass von MPL auf „Bild“ Objekt zeichnen.

PS. Aus Interesse, ich pip installiert es und nur importieren Seaborn bereits geändert den Stil von MPL. Also, es scheint zu funktionieren. Wegen des Aufrufs von matplotlib.use möchten Sie Seaborn nach MPL-Importen importieren.

enter image description here

+0

Seaborn's [kdeplot] (http://stanford.edu/~mwaskom/software/seaborn/generated/seaborn.kdeplot.html) akzeptiert als Argument die ** Achse ** zum Plotten. Dies ist der Parameter "ax". In meinem Fall habe ich mich mit meinem Problem beschäftigt, indem ich folgendes gemacht habe: 'sns.kdeplot (Daten, ax = ax, bw = 10, kernel = 'gau', cmap =" Reds ")'. In dem Code, den Sie oben gepostet haben, kann dies durch 'sns.kdeplot (yourdata, ax = subplot, bw = 10, kernel = 'gau', cmap =" Reds ")' erfolgen. Dies war zunächst mein Problem, ich konnte keinen Weg finden und stelle sicher, dass ich in wxpythons Figur (Achse) zeichne. Vielen Dank. :) – user3204834