在 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 图的主要内容,如果未能解决你的问题,请参考以下文章
在 matplotlib 图中绘制 SVG(嵌入在 wxPython 中)
在 wxPython 应用程序中嵌入 3-D 编辑器(例如 Blender)