【问题标题】:Setting x-axis label range while auto-scaling y in matplotlib在 matplotlib 中自动缩放 y 时设置 x 轴标签范围
【发布时间】:2018-05-15 14:53:21
【问题描述】:

我发现使用 matplotlib 实现感觉应该非常简单的东西真的很困难。我有 1000 个数据点的时间序列,相隔 10 秒记录。 我想绘制它们,以便将 x 轴范围正确标记为 0 到 10,000 秒。我希望自动选择 y 轴值。

无论我尝试什么,我似乎都无法让 matplotlib 在 x 轴上显示除数组中数据点的数量(即 0-1000)之外的任何标签。我试过了:

绘制两次。首先让它自动缩放,然后调用 plt.axis() 来检索 x 和 y 限制,然后将它们存储起来以供第二次调用 plt.axis([a,b,c,d])。它只是绘制了 0-1000。不知何故,它只是忽略了我并恢复到 0-1000。

我试过这个:

ax = plt.subplot(111)  

ax.xaxis.set_data_interval(0, 10000)

还有

plt.xlim(0, 10000)

无济于事,以及我现在删除和忘记的许多其他内容。我不敢相信我现在已经以某种方式浪费了时间!

有人可以帮忙吗?谢谢!

编辑:我被要求提供一个最小的例子 - 这里有两个说明我发现的两个结果,

import matplotlib.pyplot as plt
tseries=[1,2,3,4,5,6,7,8,9,10]
plt.plot(tseries)
ax = plt.subplot(111)  
ax.xaxis.set_data_interval(0, 10000)
plt.show()

这个被忽略了

import matplotlib.pyplot as plt
tseries=[1,2,3,4,5,6,7,8,9,10]
plt.plot(tseries)
plt.xlim(0, 100)
plt.show()

这个压缩了所有数据,将其保持在绘图的 0-10 范围内。

我尝试过的所有方法都产生了上述两种结果之一

基本上我只想要第一个带有第二个轴的图。

【问题讨论】:

  • 你是如何绘制这些值的? ax.plot(data) 还是 ax.plot(x, y)?因为听起来你在做前者,但你希望后者为ax.plot(range(0, 10000, 10), data)
  • @FHTMitchell 这给了我“ValueError:x 和 y 必须具有相同的第一维,但具有形状 (1000,) 和 (10001,)”
  • @DavidG 我添加了一对!欢呼

标签: python matplotlib


【解决方案1】:

也许我误解了这个问题,但这应该像创建一个包含所需时间值/标签的 X 系列一样简单。无需对轴范围做任何限制:

import matplotlib.pyplot as plt
import numpy as np
import random

values = random.sample(range(0,1000), 1000)
times = np.arange(len(values)) * 10

# alternatively:
# times = np.arange(0, len(values)*10, 10)

plt.plot(times, values)

values 有你的 1000 个数据点。您需要创建另一个数组,其中包含与您的每个值关联的时间。在您最初的问题中,您没有指定 X 数组,因此它只是根据索引 (0-9) 绘制您的值

因为您知道每个值记录相隔 10 秒,所以它应该像生成一个包含 0-1000 值的 1000 项列表一样简单,然后将每个项乘以 10 以获得实际的“记录”时间

【讨论】:

  • 你没有误解这个问题,只是低估了我对 matplotlib 的能力不足;)谢谢!
【解决方案2】:

终于找到了一个可行的解决方案。可能有更好的方法。

x = np.arange(0.0, total_time, total_time/len(tseries))
y = np.array(tseries)
plt.plot(x.flatten(),y.flatten())

编辑:

结果有时会失败,说 x 和 y 的长度不一样。
我添加了这个黑客来防止这种情况:

if len(x)!=len(y):
    l=min(len(x),len(y))
    x=x[:l]
    y=y[:l]

我猜这是由创建 x 时“total_time/len(tseries”) 项中的舍入错误引起的。
Edit2:T 先生在下面指出,可以使用 np.linspace() 来避免舍入误差。

【讨论】: