【问题标题】:How to display matplotlib numpy.ndarray in tkinter如何在 tkinter 中显示 matplotlib numpy.ndarray
【发布时间】:2019-07-31 18:18:49
【问题描述】:

我想在 tkinter 中显示 numpy.ndarray matplotlib。

我在后端尝试过,它工作正常,但没有在 tkinter 中显示并显示带有图形为空的画布。相反,下面的代码在单独的窗口中显示图片作为弹出窗口。如何在画布和窗口内显示它?

 from tkinter import *
from tkinter import ttk
import numpy as np
import pandas as pd

from scipy.stats import norm
import requests

from pandas_datareader import data as wb
import matplotlib.pyplot as plt
%matplotlib inline

from yahoofinancials import YahooFinancials



from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

import matplotlib 
matplotlib.use('TkAgg')


class Scr:

    def __init__(self, master):


        master.geometry('300x300+120+60')


        self.frame_content = ttk.Frame(master)
        self.frame_content.pack()


        tickers = ['AAPL']


        new_data = pd.DataFrame()

        for t in tickers :new_data[t] = wb.DataReader(t, data_source ='yahoo', start = '2004-1-1')['Adj Close']

        lr = np.log(1+new_data.pct_change())
        var=lr.var()
        mean=lr.mean()


        drift = mean-(0.5 * var)
        stdv=lr.std()

        norm.ppf(0.95)
        x = np.random.rand(10,2)
        norm.ppf(x)
        Ze=norm.ppf(np.random.rand(10,2))

        t_intervals =1000
        iteration=10

        daily_returns=np.exp(drift.values + stdv.values * norm.ppf(np.random.rand(t_intervals,iteration)))

        S=new_data.iloc[-1]
        am = np.zeros_like(daily_returns)
        am[0] = S

        for t in range (1, t_intervals):
            am[t]=am[t-1] * daily_returns[t]


        graph3=ttk.Frame(master)
        graph3.pack()
        graph3.place(x=750,y=550)



        plt.plot(am)
        fig3 = matplotlib.pyplot.Figure(figsize=(6,6))

        canvas3 = FigureCanvasTkAgg(fig3, graph3)
        canvas3.get_tk_widget().pack()
        ax3 = fig3.add_subplot(211)
        am.plot(kind='line', legend=True, ax=ax3).grid(linestyle = 'dashed') 



def main():

    root = Tk()
    scr = Scr(root)
    root.mainloop()

if __name__ == "__main__": main()

我得到的错误信息是:

'numpy.ndarray' 对象没有属性'plot'

【问题讨论】:

  • numpy.narray 不是 pandas.DataFrame,它有 df.plot()。使用plt.plot(am) plt.show() 或将am 转换为DataFrame
  • pack()place() 是将小部件放入窗口的两种不同方法 - 使用其中一种。您使用.place(x=750,y=550),所以绘图在窗口中,但窗口太小并且绘图不可见 - place() 不会调整窗口大小 - 所以我必须调整窗口大小才能看到绘图。 pack() 自动调整窗口大小,您会立即看到它。
  • 非常感谢。现在可以了。图形显示在画布中,图形周围的区域是黑色的,占用太多空间。有什么办法可以去除颜色并使其透明?我尝试了边框宽度和背景颜色,但它不起作用。有什么问题吗?

标签: python-3.x matplotlib tkinter numpy-ndarray


【解决方案1】:

amnumpy.ndarray

am = np.zeros_like(daily_returns)

它没有am.plot()

但是pandas.DataFrame 有。您必须将am 转换为DataFrame

    df = pd.DataFrame(am)
    df.plot(kind='line', legend=True, ax=ax3).grid(linestyle = 'dashed') 

(你可以删除plt.plot(am)


并删除graph3.place(x=750,y=550),它将情节移动得很远并且它是不可见的。您必须手动调整窗口大小才能看到情节。


from tkinter import *
from tkinter import ttk
import numpy as np
import pandas as pd

from scipy.stats import norm
import requests

from pandas_datareader import data as wb
import matplotlib.pyplot as plt

from yahoofinancials import YahooFinancials

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

import matplotlib 
matplotlib.use('TkAgg')


class Scr:

    def __init__(self, master):

        master.geometry('300x300+120+60')

        self.frame_content = ttk.Frame(master)
        self.frame_content.pack()

        tickers = ['AAPL']

        new_data = pd.DataFrame()

        for t in tickers:
            new_data[t] = wb.DataReader(t, data_source='yahoo', start='2004-1-1')['Adj Close']

        lr = np.log(1+new_data.pct_change())
        var = lr.var()
        mean = lr.mean()

        drift = mean-(0.5 * var)
        stdv = lr.std()

        norm.ppf(0.95)
        x = np.random.rand(10,2)
        norm.ppf(x)
        Ze = norm.ppf(np.random.rand(10,2))

        t_intervals =1000
        iteration = 10

        daily_returns = np.exp(drift.values + stdv.values * norm.ppf(np.random.rand(t_intervals,iteration)))

        am = np.zeros_like(daily_returns)
        am[0] = new_data.iloc[-1]

        for t in range (1, t_intervals):
            am[t]=am[t-1] * daily_returns[t]

        graph3 = ttk.Frame(master)
        graph3.pack()
        #graph3.place(x=750,y=550)

        fig3 = matplotlib.pyplot.Figure(figsize=(6,6))

        canvas3 = FigureCanvasTkAgg(fig3, graph3)
        canvas3.get_tk_widget().pack()
        ax3 = fig3.add_subplot(211)

        df = pd.DataFrame(am)
        df.plot(kind='line', legend=True, ax=ax3).grid(linestyle = 'dashed') 

def main():
    root = Tk()
    scr = Scr(root)
    root.mainloop()

if __name__ == "__main__":
    main()

【讨论】:

    猜你喜欢
    • 2018-03-02
    • 2023-03-06
    • 1970-01-01
    • 2020-06-19
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多