【问题标题】:Error with plotting line with matplotlib on tkinter Python在 tkinter Python 上使用 matplotlib 绘制线时出错
【发布时间】:2018-09-07 04:01:43
【问题描述】:

我用 tkinter 制作了一个程序,它从树视图中获取值,将它们放入 numpy 数组列表 (Xprojekti, Yprojekti),然后在 tkinter 窗口上绘制图形。 这两个列表中的值不按顺序排列,但我想绘制它们以便轴上的值按顺序排列。当我尝试这样做时,我收到此错误:

    for seg in self._plot_args(this, kwargs):
  File "C:\Python36-32\lib\site-packages\matplotlib\axes\_base.py", line 384, in _plot_args
    x, y = self._xy_from_xy(x, y)
  File "C:\Python36-32\lib\site-packages\matplotlib\axes\_base.py", line 243, in _xy_from_xy
    "have shapes {} and {}".format(x.shape, y.shape))
ValueError: x and y must have same first dimension, but have shapes (50,) and (3,)

我该怎么办?

Xprojekti=np.array([])
Yprojekti=np.array([])

for child in tree.get_children():
    ProjectSize=round(float(tree.item(child,"values")[1]),2)
    Xprojekti=np.append(Xprojekti, ProjectSize)

for child in tree.get_children():
    ProjectCost=round(float(tree.item(child,"values")[3]),2)
    Yprojekti=np.append(Yprojekti, ProjectCost)

X=np.linspace(np.min(Xprojekti), np.max(Xprojekti))  # I used this to sort the values on X

fprojekti=Figure(figsize=(6.5, 4.2),dpi=83)
grafikprojekti=fprojekti.add_subplot(111)

grafikprojekti.plot(X, Yprojekti, color="blue",marker="o", linewidth=1)
grafikprojekti.set_xlabel("Size")
grafikprojekti.set_ylabel("Costs")
grafikprojekti.set_title("All projects")
grafikprojekti.grid()

canvasprojects=FigureCanvasTkAgg(fprojekti, master=Database)
canvasprojects.show()
canvasprojects.get_tk_widget().grid(row=1,column=2,sticky="wn",padx=5)

toolbar_frameprojekti=Frame(Database)
toolbar_frameprojekti.grid(row=2,column=2,sticky="wn",padx=5)

toolbarprojects = NavigationToolbar2TkAgg(canvasprojects,toolbar_frameprojekti)
toolbarprojects.update()
canvasprojects._tkcanvas.grid(row=1,column=2,sticky="wn",padx=5,pady=10)

【问题讨论】:

  • 嗨。包含完整的堆栈跟踪或完整的自包含示例将有所帮助。鉴于错误消息,我假设错误在grafikprojekti.plot(X, Yprojekti, color="blue",marker="o", linewidth=1) 行上。对吗?
  • 好吧,我猜它就在那一行。我试图删除这条线 (X=np.linspace(np.min(Xprojekti), np.max(Xprojekti))) ,并绘制 Xprojekti 和 Yprojekti。然后它可以工作,但是 X 值不按顺序,这条线遍布整个图表
  • 请阅读理解minimal reproducible example

标签: python matplotlib tkinter


【解决方案1】:

函数linspace不是排序函数。它在指定的时间间隔内返回均匀分布的数字(请参阅documentation)。解决问题的最简单方法是:

  1. 从树中提取元组 (x,y) 列表
  2. 对此列表进行排序
  3. 按正确的顺序创建 x 和 y 列表

以下代码应该可以解决问题(未经测试,因为我没有 tree 对象)

# Get a list of points
points = []
for child in tree.get_children():
    points.append((float(tree.item(child,"values")[1]), 
                   float(tree.item(child,"values")[3])))
# Sort the points
points = sorted(point)
# Extract X and Y 
X = [v[0] for v in points]
Y = [v[1] for v in points]
# And now the rest of our code
projekti=Figure(figsize=(6.5, 4.2),dpi=83)
grafikprojekti=fprojekti.add_subplot(111)
grafikprojekti.plot(X, Y, color="blue",marker="o", linewidth=1)

几个cmets:

  1. 我没有将值四舍五入到小数点后两位,我认为您不需要它
  2. 对列表进行排序是因为在对元组列表进行排序时,首先比较元组的第一个元素
  3. 最好尽可能一次性迭代结构,以确保保留顺序。

【讨论】:

  • 我需要 Xprojekti 中的第一个值对应于 Yprojekti 中第一个值的值,Xprojekti 中的第二个值与 Yprojekti 中的第二个值,依此类推。
  • 我给出的代码应该可以做到这一点。你测试了吗?结果如何?
猜你喜欢
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 2015-08-13
  • 2020-07-10
  • 1970-01-01
  • 2015-02-21
相关资源
最近更新 更多