在 WxPython 面板中嵌入 Seaborn 图

Posted

技术标签:

【中文标题】在 WxPython 面板中嵌入 Seaborn 图【英文标题】:Embedding Seaborn plot in WxPython panel 【发布时间】:2015-10-23 20:30:02 【问题描述】:

我想问一下如何在wxPython 面板中嵌入 seaborn 人物。

与post 类似,我想在wxPython 面板中嵌入一个外部图形。根据 Seaborn 的kdeplot 函数,我希望我的wxPython GUI 的特定面板根据高斯核的带宽值绘制我的数据的密度等值线,以及数据点的散点图。这是我希望在面板中绘制的示例:

直到现在,我已经设法从wxPython 面板中获得了我想要的一个单独的图形。是否可以在wxPython 面板中嵌入一个 seaborn 绘图,或者应该找到一种替代方法来实现我的想要吗?

下面是我的代码的特定部分,它会在需要时生成绘图:

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()

这部分代码在 wxPython 面板中绘制分散的数据点,并为密度等值线创建外部图形。但是,如果我尝试ax.sns.kdeplot(...) 我会收到错误

属性错误:AxesSubplot 对象没有属性 .sns

我不知道是否可以在wxPython 面板中嵌入 Seaborn 图形,或者我应该尝试以其他方式实现它。有什么建议吗?

提前致谢。

【问题讨论】:

seaborn (sns) 使用 MPL,但它是一个完全独立的库。 ax.sns 没有意义。你想将ax 传递给sns.kdeplot 函数。 我正是这样做的,它就像一个魅力。我在函数的page 上注意到它接受这样的参数。更具体地说,ax 参数显示要绘制的 。因此,就我而言,我通过以下方式解决了我的问题:sns.kdeplot(data, **ax=ax**, bw=10, kernel='gau', cmap="Reds")。非常感谢你:)。 【参考方案1】:

我对 wxPython 一无所知,但如果您想在特定轴上绘图,请使用 ax 关键字参数。

【讨论】:

其实我并没有注意到函数的page 接受了这样的参数。可以看出,seaborn.kdeplot(data, data2=None, shade=False, vertical=False, kernel='gau', bw='scott', gridsize=100, cut=3, clip=None, legend=True, cumulative=False, shade_lowest=True, **ax=None** , **kwargs)ax 参数显示了要绘制的 。因此,就我而言,我通过以下方式解决了我的问题:sns.kdeplot(data, **ax=ax**, bw=10, kernel='gau', cmap="Reds")。感谢您的帮助:)。【参考方案2】:

我从未使用过 Seaborn,但我猜是因为文档说“Seaborn 是基于 matplotlib 的 Python 可视化库”,您可能可以使用名为 FigureCanvasWxAgg 的 MPL 类。

这是在 wxPython 中嵌入 MPL 图的示例代码。

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()

您可能只需将绘图代码替换为 sns 内容,并确保在 MPL 的“Figure”对象上绘图。

PS。出于兴趣,我 pip 安装了它,只是导入 seaborn 已经改变了 MPL 的风格。所以,它似乎工作。由于 matplotlib.use 调用,您将需要在 MPL 导入后导入 seaborn。

【讨论】:

Seaborn 的 kdeplot 接受要绘制的 作为参数。这是ax 参数。就我而言,我通过以下方式解决了我的问题:sns.kdeplot(data, ax=ax, bw=10, kernel='gau', cmap="Reds")。在您上面发布的代码中,这可以由sns.kdeplot(yourdata, ax=subplot ,bw=10, kernel='gau', cmap="Reds") 完成。这最初是我的问题,我找不到方法并确保在 wxpython 的图形(轴)中绘图。谢谢。 :)

以上是关于在 WxPython 面板中嵌入 Seaborn 图的主要内容,如果未能解决你的问题,请参考以下文章

wxpython中的派生面板类

在 matplotlib 图中绘制 SVG(嵌入在 wxPython 中)

在 wxPython 应用程序中嵌入 3-D 编辑器(例如 Blender)

在 PyQt (pyqtgraph) 中嵌入“图形类型”Seaborn 图

新人求助wxPython中嵌入ActiveX控件的问题

为啥我的文本在 wxPython 中没有正确对齐?