matplotlib 上的简单界面效果在wxpython上显示不了

时间:2021-08-26 20:33:23
下面是代码:
#-*-coding:utf-8-*-

import matplotlib.pyplot as plt

import matplotlib.ticker as mticker
import cartopy.crs as ccrs
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER

from matplotlib.offsetbox import AnnotationBbox,OffsetImage
from PIL import Image

fig=plt.figure(figsize=(20,10))
ax = plt.axes(projection=ccrs.PlateCarree())
ax.coastlines()
ax.stock_img()
gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,
                  linewidth=2, color='gray', alpha=15, linestyle='--')
gl.xlabels_top = False
gl.ylabels_left = False
gl.xlines = False
gl.xlocator = mticker.FixedLocator([-180, -45, 0, 45, 180])
gl.xformatter = LONGITUDE_FORMATTER
gl.yformatter = LATITUDE_FORMATTER
gl.xlabel_style = {'size': 15, 'color': 'gray'}
gl.xlabel_style = {'color': 'red', 'weight': 'bold'}

img=Image.open(r'E:\python_file\untitled\p.png')
imagebox=OffsetImage(img,zoom=0.05)
imagebox.image.axes=ax

ab=AnnotationBbox(imagebox,[55,10],pad=0,frameon=False)
ax.add_artist(ab)


plt.show()
 

4 个解决方案

#1


可以尝试一下:把ax画到canvas上,然后渲染一下,再显示出来,我只试过pygame的,并没有试过wx,不过应该两者思路是一样的,可以尝试一下

datafig = plt.figure(figsize=[4, 8],dpi=70)
canvas = agg.FigureCanvasAgg(datafig)
renderer = canvas.get_renderer()#渲染
raw_data = renderer.tostring_rgb()#图像转成数据
surf = pygame.image.fromstring(raw_data, size, "RGB")#创造曲线显示平面

#2


确实是canvas的问题,后面在网上也找到答案了,谢谢

#3


这是实现了的代码:
#-*-coding:utf-8-*-
import matplotlib
matplotlib.use('WXAgg')
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import cartopy.crs as ccrs
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
from matplotlib.offsetbox import AnnotationBbox,OffsetImage
from PIL import Image
import wx


from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.backends.backend_wx import NavigationToolbar2Wx
from matplotlib.figure import Figure
class Canvas(wx.Panel):
    def __init__(self,parent):
            wx.Panel.__init__(self, parent)
            self.fig=plt.figure()
            self.ax = plt.axes(projection=ccrs.PlateCarree())
            self.ax.coastlines()
            self.ax.stock_img()
            self.canvas = FigureCanvas(self, -1, self.fig)

            self.gl = self.ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,
                              linewidth=2, color='gray', alpha=15, linestyle='--')
            self.gl.xlabels_top = False
            self.gl.ylabels_left = False
            self.gl.xlines = False
            self.gl.xlocator = mticker.FixedLocator([-180, -45, 0, 45, 180])
            self.gl.xformatter = LONGITUDE_FORMATTER
            self.gl.yformatter = LATITUDE_FORMATTER
            self.gl.xlabel_style = {'size': 15, 'color': 'gray'}
            self.gl.xlabel_style = {'color': 'red', 'weight': 'bold'}
            self.sizer = wx.BoxSizer(wx.VERTICAL)
            self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
            self.SetSizer(self.sizer)
            self.Fit()
    def draw(self):
            img=Image.open(r'E:\python_file\untitled\p.png')
            imagebox=OffsetImage(img,zoom=0.05)
            imagebox.image.axes=self.ax
            ab=AnnotationBbox(imagebox,[55,10],pad=0,frameon=False)
            self.ax.add_artist(ab)



if __name__ == "__main__":
    app = wx.App()
    fr=wx.Frame(None,title='test')
    panel=Canvas(fr)
    print('fine')
    panel.draw()
    fr.Show()
    print('just')
    app.MainLoop()

#4


引用 2 楼 a13071226407 的回复:
确实是canvas的问题,后面在网上也找到答案了,谢谢

哈哈哈,恭喜恭喜,一起学习,一起讨论

#1


可以尝试一下:把ax画到canvas上,然后渲染一下,再显示出来,我只试过pygame的,并没有试过wx,不过应该两者思路是一样的,可以尝试一下

datafig = plt.figure(figsize=[4, 8],dpi=70)
canvas = agg.FigureCanvasAgg(datafig)
renderer = canvas.get_renderer()#渲染
raw_data = renderer.tostring_rgb()#图像转成数据
surf = pygame.image.fromstring(raw_data, size, "RGB")#创造曲线显示平面

#2


确实是canvas的问题,后面在网上也找到答案了,谢谢

#3


这是实现了的代码:
#-*-coding:utf-8-*-
import matplotlib
matplotlib.use('WXAgg')
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import cartopy.crs as ccrs
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
from matplotlib.offsetbox import AnnotationBbox,OffsetImage
from PIL import Image
import wx


from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.backends.backend_wx import NavigationToolbar2Wx
from matplotlib.figure import Figure
class Canvas(wx.Panel):
    def __init__(self,parent):
            wx.Panel.__init__(self, parent)
            self.fig=plt.figure()
            self.ax = plt.axes(projection=ccrs.PlateCarree())
            self.ax.coastlines()
            self.ax.stock_img()
            self.canvas = FigureCanvas(self, -1, self.fig)

            self.gl = self.ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,
                              linewidth=2, color='gray', alpha=15, linestyle='--')
            self.gl.xlabels_top = False
            self.gl.ylabels_left = False
            self.gl.xlines = False
            self.gl.xlocator = mticker.FixedLocator([-180, -45, 0, 45, 180])
            self.gl.xformatter = LONGITUDE_FORMATTER
            self.gl.yformatter = LATITUDE_FORMATTER
            self.gl.xlabel_style = {'size': 15, 'color': 'gray'}
            self.gl.xlabel_style = {'color': 'red', 'weight': 'bold'}
            self.sizer = wx.BoxSizer(wx.VERTICAL)
            self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
            self.SetSizer(self.sizer)
            self.Fit()
    def draw(self):
            img=Image.open(r'E:\python_file\untitled\p.png')
            imagebox=OffsetImage(img,zoom=0.05)
            imagebox.image.axes=self.ax
            ab=AnnotationBbox(imagebox,[55,10],pad=0,frameon=False)
            self.ax.add_artist(ab)



if __name__ == "__main__":
    app = wx.App()
    fr=wx.Frame(None,title='test')
    panel=Canvas(fr)
    print('fine')
    panel.draw()
    fr.Show()
    print('just')
    app.MainLoop()

#4


引用 2 楼 a13071226407 的回复:
确实是canvas的问题,后面在网上也找到答案了,谢谢

哈哈哈,恭喜恭喜,一起学习,一起讨论