Matplotlib子图内容使用set_xlim,set_ylim消失

时间:2013-01-23 09:05:36

标签: python matplotlib

我正在尝试构建一个图表,其中我有固定的行数但每行的列数不同。我用于绘图的代码相当于:

import matplotlib.pyplot as pl
pl.figure()
pl.ion()
pl.subplot(2,1,1)
pl.title("Sets the title for top plot")

plotData(data[0]) # Function that plots data in this first row

for i in range(3):
    pl.subplot(2,3,4+i)
    pl.title("Sets the title of each subplot in second row")
    plotData(data[i+1]) # Plots the data in second row

现在由于某种原因,在第二行的子图中绘制的数据消失了。当我调试它时,它似乎就在那里,直到从for循环中的plotData()函数返回(或者可能在调用时) 下一个subplot命令 - 但这并没有解释为什么最后一个子图是空的......)。

编辑:

plotData()函数末尾的代码触发了问题:

pl.gca().set_xlim(0,15)
pl.gca().set_ylim(0,15)

这是否意味着在绘制数据后我无法设置x,y限制,或者我在这里做错了什么?

可以找到显示问题的最小示例的pastebin here

2 个答案:

答案 0 :(得分:1)

好的,这很令人尴尬。如果你看看pastebin上的代码,问题是我设置的xlim和ylim没有考虑到我切换坐标系的方向(在y方向)。在plotData()

for i,dset in enumerate(data):
    x = np.array([point['x'] for point in dset])
    y = np.array([-point['y'] for point in dset])

我对set_xlimset_ylim的调用完全符合他们的预期,只是在我设置的限制下,数据在这些图中不再可见(因为我切换了数据上的y轴,但没有限制)。

答案 1 :(得分:0)

我同意@Zhenya - 我没有看到这个功能与最新的matplotlib(开发版本1.3-dev并且怀疑它至少在v1.2.0中修复,但可能甚至早在v1.0.1)。

HTH,

更新:添加了mpl v1.2.0的输出

> python
Python 2.7.2
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib
>>> print matplotlib.__version__
1.2.0
>>> 
>>> import matplotlib.pyplot as plt
>>> 
>>> plt.ion()
>>> 
>>> plt.subplot(2,1,1)
<matplotlib.axes.AxesSubplot object at 0x283d790>
>>> plt.title("Sets the title for top pltot")
<matplotlib.text.Text object at 0x2851f50>
>>> 
>>> plt.plot(range(10, 0, -1))
[<matplotlib.lines.Line2D object at 0x2c40790>]
>>> 
>>> for i in range(3):
...     plt.subplot(2,3,4+i)
...     plt.title("Sets the title of each subplot in second row")
...     plt.plot(range(10))
... 
<matplotlib.axes.AxesSubplot object at 0x2c40e90>
<matplotlib.text.Text object at 0x2c64a90>
[<matplotlib.lines.Line2D object at 0x2c6e990>]
<matplotlib.axes.AxesSubplot object at 0x2c6ec10>
<matplotlib.text.Text object at 0x2e6c810>
[<matplotlib.lines.Line2D object at 0x2e78110>]
<matplotlib.axes.AxesSubplot object at 0x2e78390>
<matplotlib.text.Text object at 0x2e8ced0>
[<matplotlib.lines.Line2D object at 0x2e98610>]

output