Matplotlib:为什么绘图总是封闭的形状?
Matplotlib: why are plots always closed shapes?
在 Python 2.7.
中使用 1.5.1
我正在创建一个图形,向其添加一个轴对象,创建一个 canvas,然后将其放入 window。为了绘制一个简单的图形,我在轴对象中设置了 X 和 Y 的限制,然后使用一个 numpy 值范围和一个相同长度的 y 值数组以及一些格式选项调用 plot 成员函数。
我得到的是一张很好的数据图表,但它被绘制为一条闭合曲线,这意味着有一条对角线从我的图表的末尾回到开头。
为什么要这样做?当 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 上这样做,但几年前 运行 在 Gumstix SOM 运行 Linux.[=13 上我遇到了同样的问题=]
我无法使用给定的代码重现您的问题
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 的严格函数来绘制事物的行为。
BrenBarn 在对原始 post 的评论中确定了解决方案:使用 GTKAgg 后端而不是 GTK 后端。谢谢。
在 Python 2.7.
中使用 1.5.1我正在创建一个图形,向其添加一个轴对象,创建一个 canvas,然后将其放入 window。为了绘制一个简单的图形,我在轴对象中设置了 X 和 Y 的限制,然后使用一个 numpy 值范围和一个相同长度的 y 值数组以及一些格式选项调用 plot 成员函数。
我得到的是一张很好的数据图表,但它被绘制为一条闭合曲线,这意味着有一条对角线从我的图表的末尾回到开头。
为什么要这样做?当 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 上这样做,但几年前 运行 在 Gumstix SOM 运行 Linux.[=13 上我遇到了同样的问题=]
我无法使用给定的代码重现您的问题
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 的严格函数来绘制事物的行为。
BrenBarn 在对原始 post 的评论中确定了解决方案:使用 GTKAgg 后端而不是 GTK 后端。谢谢。