python - ValueError: x 和 y 必须具有相同的第一维,但具有形状、tkinter 和 matplotlib 问题
问题描述
几天来我一直在玩 GUI 和 matlib,但我在下面的代码中找不到问题。
from tkinter import *
import matplotlib.pyplot as plt
import numpy as np
root = Tk()
root.geometry('700x700')
entry1 = Entry(root, width = 20)
entry1.pack()
def button_command():
x = np.array(np.linspace(10,1,10))
y = np.array(entry1.get())
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.spines['left'].set_position('center')
ax.spines['bottom'].set_position('zero')
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
plt.plot(x,y, "r")
plt.show()
return None
Button(root, text="Draw function", command=button_command).pack()
root.mainloop()
我一直收到这个错误:
ValueError: x and y must have same first dimension, but have shapes (10,) and (1,)
我试图删除 np.array
x = np.linspace(10,1,10)
y = entry1.get()
但我不知道如何将 y = entry1.get() 与 x = np.linspace(10,1,10) 结合起来
我要输入的函数是200-4*x
编辑:完整的错误代码:
Traceback (most recent call last):
File "Python\Python39\lib\tkinter\__init__.py", line 1884, in __call__
return self.func(*args)
File "gui.py", line 21, in button_command
plt.plot(x,y, "r")
File "Python\Python39\lib\site-packages\matplotlib\pyplot.py", line 2988, in plot
return gca().plot(
File "Python\Python39\lib\site-packages\matplotlib\axes\_axes.py", line 1605, in plot
lines = [*self._get_lines(*args, data=data, **kwargs)]
File "Python\Python39\lib\site-packages\matplotlib\axes\_base.py", line 315, in __call__
yield from self._plot_args(this, kwargs)
File "Python\Python39\lib\site-packages\matplotlib\axes\_base.py", line 501, in _plot_args
raise ValueError(f"x and y must have same first dimension, but "
ValueError: x and y must have same first dimension, but have shapes (10,) and (1,)
解决方案
y = entry1.get()
至少可以说,将字符串转换为函数表达式是不够的。作为一个选项,尝试使用SymPy库及其parse_expr和lambdify方法:
import tkinter as tk
from sympy import symbols, lambdify
from sympy.parsing.sympy_parser import parse_expr
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk)
import numpy as np
root = tk.Tk()
root.geometry('700x700')
entry1 = tk.Entry(root, width=20)
entry1.pack()
def draw():
expr = parse_expr(entry1.get())
lam = lambdify(symbols('x'), expr)
x = np.array(np.linspace(-10, 10, 100))
y = lam(x)
plot.plot(x, y)
canvas.draw()
tk.Button(root, text="Draw function", command=draw).pack()
fig = Figure(figsize=(5, 4), dpi=100)
plot = fig.add_subplot()
plot.spines['left'].set_position('center')
plot.spines['bottom'].set_position('zero')
plot.spines['right'].set_color('none')
plot.spines['top'].set_color('none')
canvas = FigureCanvasTkAgg(fig, master=root)
toolbar = NavigationToolbar2Tk(canvas, root, pack_toolbar=False)
toolbar.update()
toolbar.pack(side=tk.BOTTOM, fill=tk.X)
canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)
root.mainloop()
推荐阅读
- python - 如何将数据框中的值转换为值
- javascript - Javascript更改导航的CSS属性背景(materializeCSS)
- c# - NettopologySuite 和 Dotspatial WKTReader
- haproxy - 是否可以将 cookie 的散列值写入 haproxy 的标头?
- python - 嵌套字典字段中的前夕 0.8 `allow_unknown`
- matlab - 制作一个对数字中的数字求和的函数
- python - 在 0.8.8 之前的版本中创建页眉和页脚
- floating-point - 使用泛型类型时如何使用浮点数文字?
- android - 在我的应用中显示来自其他站点的数据
- angular - 错误 TS2304:找不到名称“MatPaginator”