【问题标题】:Is there a way to stop plotting values after certain x value?有没有办法在某个 x 值之后停止绘制值?
【发布时间】:2022-01-21 23:24:03
【问题描述】:

我正在使用 matplotlib 绘制训练神经网络的结果。

我成功地使用make_interp_spline 在给定的 x 轴 50(纪元)上绘制了我的结果。¹

当然,x 和 y 的大小相同(都有 9 个值),所以我很容易绘制它们。现在,我必须在同一个图上显示多个结果,因此我需要在 x 轴上使用不同的值,因为某些结果基于值(Epoch - 这是我的 x 轴)> 50(例如 60, 70 等)。

我尝试初始化一个大于 50 的 linspace,它可以工作,但结果以指数方式上升。² 有没有办法从 x = 50 开始“删除”点?

另外,如果我在 x 轴上添加值,python 会抛出一个错误:

ValueError: Shapes of x (14,) and y (10,) are incompatible

我将把我所取得的成就留到现在。

import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import make_interp_spline

listA = [0.00,25.98386517667222,36.10066770794748,
         31.70895801412648,29.430944916297648,
         27.164039966977874,30.26995937742036,
         29.23696275469900,28.11570993620774,
         28.608378364299906]

epochList = [0, 10, 15, 20, 25, 30, 35, 40, 45, 50]

xnew = np.linspace(0, 50, 100)  
spl_A = make_interp_spline(epochList, listA, k=3)

plt.figure(figsize=(15,15))

plt.plot(xnew, spl_A(xnew), label='A')
plt.scatter(epochList,listA)

plt.xlabel('Epochs')
plt.xticks(np.arange(min(epochList), max(epochList)+1, 5.0))

plt.ylabel('MAE')
plt.yticks(np.arange(0, 62, 5.0))

del listA[0]
plt.scatter(epochList[listA.index(min(listA))+1], min(listA), label=F'Best MAE = {min(listA)}', s=200, marker='*', c='black')
plt.legend(loc='upper right', prop={'size': 14})

plt.grid()
plt.show()

【问题讨论】:

  • 第二张图的代码是什么?
  • 只需将xnew = np.linspace(0, **50**, 100) 编辑为xnew = np.linspace(0, **70**, 100)

标签: python matplotlib plot scipy


【解决方案1】:

你似乎没有改变listA。从第二张图中,它看起来像是在用新的xnew 绘制旧的interolop 函数。由于旧图的末端是指数的,因此新图的末端部分变成指数的。我假设您在以后的“时代”中有新的“MAE”数据。因此,您必须将这些数据放入listA。您显示的错误可能是由于您向epoch 列表添加新值但未向listA 添加任何内容。

【讨论】:

  • 我明白你在说什么 :) 但是,问题是:想象一下,除了绘制 listA 之外,我还有一个 listB 来绘制 10 个值,而不是 9 个(如你所说)。在这种情况下,epochList 将被初始化为 10 个值,但是 Python 在绘制 listA 时会抛出错误,因为该列表由 9 个值组成,而 epochList 有 10 个值。我希望你明白了。 :)
  • 我还是不明白你为什么要用两种不同的尺寸来初始化?如果您有两个 y 数据列表,那么您可以将它们连接起来。如果您可以提供有关您的数据的更多详细信息,也许我可以提供帮助。
  • 当然可以。如果我提供有关数据的详细信息,那就太复杂了。所以,想想我在 OP 中编写的程序。我想要实现的是:i.imgur.com/lwXuJuH.png。绿线一直到 55 纪元。橙色和蓝色在 50 处停止。问题是橙色和蓝色有 9 个值要绘制,而绿色有 10 个,因此 Python 给我的错误,因为橙色和蓝色有 9 y 值绘制在 10 个 x 值上。请注意,所有 3 个列表都使用相同的 epochList(10 个值)绘制。我希望这不会太令人困惑。 :)
  • 解决方案是用None 填充较短的列表或制作单独的epoch 列表。例如,epoch1 = [5,10,...,50]epoch2 = [5,10,...,70]
  • 创建 2 个列表、2 个 linspaces 并在该特定 linspace (70) 上绘制更大的列表,解决了我的问题!这就是我得到的:i.imgur.com/oX8vkAe.png 非常感谢,很抱歉造成误解! :)
猜你喜欢
  • 1970-01-01
  • 2021-07-25
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 2020-11-04
  • 2013-12-25
  • 1970-01-01
相关资源
最近更新 更多