【问题标题】:Can I see all attributes of a pyplot without showing the graph?我可以在不显示图表的情况下查看 pyplot 的所有属性吗?
【发布时间】:2022-01-06 18:37:15
【问题描述】:

我正在为我大学的一门课程编写家庭作业,作为助教。

我们正在使用 Otter Grader(OKPy 的扩展)对我们通过 Jupyter Notebooks 提供的指导性作业提交的学生进行评分。

要求学生使用matplotlib.pyplot.axhline() 在他们的绘图上绘制水平线,我希望使用assert 调用来确定他们是否在绘图中添加了水平线。

有没有办法在 matplotlib 中查看已添加到 pyplot 的所有属性?

【问题讨论】:

  • 您不会看到特定的水平线属性,但您可以访问绘图的所有线并查看这些线是否对所有点具有相同的 y 值。要我给你看吗?

标签: python-3.x matplotlib jupyter jupyter-lab


【解决方案1】:

我不相信有办法查看是否使用了 axhline 属性,但是有一种方法可以通过使用 @987654323 访问所有 line2D 对象来查看线条是否水平@ 属性。

import matplotlib.pyplot as plt
import numpy as np


def is_horizontal(line2d):
    x, y = line2d.get_data()
    y = np.array(y)  # The axhline method does not return data as a numpy array
    y_bool = y == y[0]  # Returns a boolean array of True or False if the first number equals all the other numbers
    return np.all(y_bool)


t = np.linspace(-10, 10, 1000)

plt.plot(t, t**2)
plt.plot(t, t)
plt.axhline(y=5, xmin=-10, xmax=10)

ax = plt.gca()

assert any(map(is_horizontal, ax.lines)), 'There are no horizontal lines on the plot.'

plt.show()

如果没有至少一个 line2D 对象包含所有 y 值都相同的数据,则此代码将引发错误。

请注意,为了使上述方法起作用,必须使用 axhline 属性而不是 hlines 方法。 hlines 方法不会将 line2D 对象添加到坐标区对象。

【讨论】:

  • 谢谢! ax.lines 对象似乎可以进一步调查。我认为轴对象中的任何线都可以迭代以找到点?
  • 是的。使用get_data 方法返回两个数组。第一个是 x 值,第二个是 y 值。欢迎来到堆栈溢出!如果您喜欢某个答案并认为它是正确的,请按该复选标记。 @AlexS。
  • 我将您的答案标记为答案!感谢您的帮助。如果您不介意,我还有一个问题:您知道从点获取相同数据的方法吗?如果我使用 plt.scatter() 或使用 plt.plot() 并将线宽设置为 0,则坐标区对象不再包含线,这意味着我无法以这种方式提取 x 和 y 值。我也可以单独提出 Stack Overflow 问题。
  • @AlexS。您应该问另一个问题以获取更多详细信息。我会检查你今天晚些时候发布的问题,或者你可以在帖子上@我。如果将线宽设置为 0,则它不会显示在绘图上,但您仍然应该能够从轴对象访问数据。 plt.scatter 不返回 line2D;相反,它返回一个PathCollection,您必须通过collections 属性访问它,类似于轴对象的lines 属性。
猜你喜欢
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多