使用set_xlim和set_ylim时Matplotlib子图内容消失

3 投票
2 回答
4412 浏览
提问于 2025-04-17 13:24

我正在尝试制作一个图表,这个图表有固定的行数,但每一行的列数不一样。我用来绘图的代码大致是这样的:

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() 函数返回之前是存在的(或者可能是在调用下一个子图命令时消失的——但这并不能解释为什么最后一个子图是空的……)。

编辑:

plotData() 函数的末尾有一段代码引发了这个问题:

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

这是否意味着我不能在绘制数据之后设置 x 和 y 的范围,或者我这里做错了什么?

可以在 这里 找到一个展示问题的最小示例的 pastebin。

2 个回答

0

我同意@Zhenya的看法 - 在最新的matplotlib版本中(开发版1.3-dev),我没有看到这个功能。我怀疑在至少v1.2.0版本中已经修复了这个问题,可能甚至在v1.0.1版本时就已经解决了。

希望这对你有帮助,

更新:添加了来自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>]

输出

1

好吧,这真是尴尬。如果你看看pastebin上的代码,问题在于我设置的x轴和y轴的范围没有考虑到我把坐标系的方向(在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轴符号换了,但范围却没有换)。

撰写回答