我正在使用tkinter和py2app创建Mac App,尝试合并plotly.express时遇到问题。 (在Mac OS 10.15.4上为Python 3.7)
应用程序向用户询问时间序列的长度,并使用指定的长度以及标签“ a”,“ b”和“ c”覆盖三个随机时间序列的图。
import numpy as np
import matplotlib.pyplot as plt
from tkinter import Tk, Label, Button, Entry,
import matplotlib.pyplot as plt
import plotly.express as px
import pandas as pd
window = Tk()
plt.switch_backend('TkAgg')
window.title("Plotter")
window.geometry('500x500')
length_label=Label(window, text="Length")
length_label.grid(row=0,column=0)
length = Entry(window,width=20)
length.grid(row=0,column=1)
'''Plot time series'''
def _plot():
np.random.seed(123)
num_times=int(length.get())
X = np.random.randn(num_times,3)
df=pd.DataFrame(X, columns=['a','b','c'])
df['x'] = df.index
df_melt = pd.melt(df, id_vars="x", value_vars=df.columns[:-1])
fig=px.line(df_melt, x="x", y="value",color="variable")
fig.show()
plot_button = Button(master=window, text="Plot", command=_plot)
plot_button.grid(row=1, column=0)
'''Quit Button'''
def _quit():
window.quit()
window.destroy()
quit_button = Button(master=window, text="Quit", command=_quit)
quit_button.grid(row=2, column=0)
window.mainloop()
到目前为止一切正常。
使用py2app,我可以按照通常的步骤创建应用程序:
py2applet --make-setup myapp.py
rm -rf build dist
python setup.py py2app -A
文件通过以下方式从终端运行./dist/myapp.app/Contents/MacOS/myapp
然后我通过python setup.py py2app
双击后,打开的桌面应用程序结果将打开。它接受我的“长度”条目。但是,在点击绘图按钮后,什么也没有发生。我应该在浏览器窗口中看到一个图形。
我确实注意到,如果我更换了,一切都可以正常工作(即使双击应用程序时也可以)
df['x'] = df.index
df_melt = pd.melt(df, id_vars="x", value_vars=df.columns[:-1])
fig=px.line(df_melt, x="x", y="value",color="variable")
fig.show()
更简单
plt.plot(df)
plt.show()
当然,现在该图仅在新窗口中打开。我失去了plotly.express的出色互动功能,例如缩放,平移等
因为我希望从熊猫数据框中创建一个交互式图,所以我在袖扣包中使用了igraph命令,而不是plotly.express。正如https://plotly.com/python/cufflinks/的袖扣文档所指出的那样,“通过将asFigure = True参数传递给.iplot(),袖扣的工作方式与Plotly Express类似...”
我的代码现在看起来如下:
import numpy as np
from tkinter import Tk, Label, Button, Entry,Label
import pandas as pd
import cufflinks
window = Tk()
window.title("Browser Plotter")
window.geometry('500x500')
length_label=Label(window, text="Length")
length_label.grid(row=0,column=0)
length = Entry(window,width=20)
length.grid(row=0,column=1)
'''Plot time series'''
def _plot():
np.random.seed(123)
num_times=int(length.get())
X = np.random.randn(num_times,3)
df=pd.DataFrame(X, columns=['a','b','c'])
fig=df.iplot(asFigure=True,xTitle='time',yTitle='values',title='Time Series Plot')
fig.show()
plot_button = Button(master=window, text="Plot", command=_plot)
plot_button.grid(row=1, column=0)
'''Quit Button'''
def _quit():
window.quit()
window.destroy()
quit_button = Button(master=window, text="Quit", command=_quit)
quit_button.grid(row=2, column=0)
window.mainloop()
我还更新了setup.py文件,使其包含在内
'packages':'cufflinks'
作为一种选择。运行时尽管收到错误消息“ ImportError:No module named'cuffinks”python setup.py py2app,双击将打开最终的应用程序。