【问题标题】:Matplotlib: why are plots always closed shapes?Matplotlib:为什么绘图总是封闭的形状?
【发布时间】:2016-05-24 20:08:35
【问题描述】:

在 Python 2.7 中使用 1.5.1。

我正在创建一个图形,向其中添加一个坐标区对象,创建一个画布,并将其放入一个窗口中。为了绘制一个简单的图形,我在轴对象中设置了 X 和 Y 限制,然后调用 plot 成员函数,其中包含一个 numpy 值范围和一个相同长度的 y 值数组,以及一些格式选项。

我得到的是我的数据的一个很好的图表,但它被绘制为一条闭合曲线,这意味着有一条对角线从我的图表的末端回到起点。

为什么要这样做?我可以看到执行此操作的选项的偶尔实用性,当 X 值不是单调增加时(例如,绘制多边形),但这似乎不是一个合理的默认值。我看不到任何会影响此的轴属性或任何绘图参数。有谁知道如何让它不会像这样缠绕?

编辑:这是一些示例代码。它假定 PyGTK 作为 GUI 环境:

import numpy
import gtk
import matplotlib
from matplotlib.figure import Figure
from matplotlib.backends.backend_gtk import FigureCanvasGTK as FigureCanvas

class junk:

    def __init__(self):

        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.connect('destroy', self.destroy)
        self.window.set_title('junk')
        self.window.resize(400, 400)

        self.figure = Figure()
        self.axes = self.figure.add_axes((0, 0, 1, 1))
        self.canvas = FigureCanvas(self.figure)
        self.canvas.show()

        self.window.add(self.canvas)

        self.axes.set_xlim(-10, 12)
        self.axes.set_ylim(-1, 122)
        x = numpy.arange(-9, 12)
        self.axes.plot(x, x * x, linestyle = 'solid')

        self.canvas.draw()

        self.window.show_all()

    def destroy(self, widget, data = None):

        gtk.main_quit()

    def main(self):

        gtk.main()

if __name__ == '__main__':

    app = junk()
    app.main()

这显示了一条偏离中心的抛物线,结果如下所示:

现在将 Y 下限从 -1 更改为 1,这样它会稍微剪裁底部,结果如下所示:

这表明如果绘制图形需要多条路径,则每条路径都有虚假环绕。

我在 Windows 上执行此操作,但几年前我在运行 Linux 的 Gumstix SOM 上运行时遇到了同样的问题。

【问题讨论】:

  • 请提供一个显示问题的示例程序。
  • 这确实需要 MWE——我从未见过例如plot([0,1,1],[0,0,1]) 创建一条闭合曲线(在这种情况下,画一条从x,y={1,1} 到x,y={0,0} 的线
  • 我提供了这个作为对原始帖子的编辑。
  • 您能否使用其他 GUI 环境和/或 pyplot 而不是用于绘图的自定义 GUI 容器来重现此内容?
  • 另外,您使用 GTK 后端而不是 GTKAgg 是否有原因?我在使用 GTK 后端时确实看到了工件,但在使用 GTKAgg 时却没有。根据文档,GTK 后端“不推荐”。

标签: matplotlib plot axes


【解决方案1】:

我无法使用给定的代码重现您的问题

import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
x = np.arange(-9, 12)
ax.plot(x, x*x)
plt.show()

按照您传入的顺序在点之间绘制一条线。这是一种行为,因此您可以使用 x 的非严格函数来绘制事物。

【讨论】:

  • 确实没有显示您的代码有问题,但是如果我尝试使用发布的实际代码,我确实看到了错误。它似乎是特定于后端的。
【解决方案2】:

BrenBarn 在对原帖的评论中确定了解决方案:使用 GTKAgg 后端而不是 GTK 后端。谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多