向辅助轴添加线条时出现以下内存错误:
MemoryError: Unable to allocate 48.2 GiB for an array with shape (1726364447,) and data type [('val', '<i8'), ('maj', '?'), ('min', '?'), ('fmt', 'S20')]
在 Jupyter Notebook 中运行以下命令时产生错误
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
np.random.seed(0)
t = pd.Timestamp('2024-09-15 07:02:04')
times = []
for i in range(101):
times.append(t)
t = t + pd.Timedelta(f'{np.random.randint(7, 10)}s')
data1 = pd.Series(
np.random.normal(size=101),
index=pd.DatetimeIndex(times),
name='Data 1'
)
data2 = pd.Series(
[5.67, 5.85, 5.78],
index=pd.DatetimeIndex(["2024-09-15 07:03:39", "2024-09-15 07:08:43", "2024-09-15 07:13:47"])
)
fig, ax = plt.subplots(figsize=(7, 2.5))
data1.plot(ax=ax, style='.-')
data2.plot(ax=ax, style='.-', secondary_y=True)
ax.grid()
plt.show()
但是,只要对数据进行微小的更改,就不会出现错误。 例如,如果我将第二个数据集的最后一个点的时间从
"2024-09-15 07:13:47"
更改为 "2024-09-15 07:12:47"
,则绘图不会出现问题:
请注意,两个数据集都有不均匀间隔的日期时间索引。
不确定这是否与此错误有关:
其他人可以重现此错误吗?
版本:
已知问题,问题可以在这里找到:link
可以这样修复:
首先,data1.plot 使用 pandas 内置绘图函数,该函数与 matplotlib 集成,但引入了对刻度、标签和格式的额外内部处理(导致内存错误)
更改此(原始):
data1.plot(ax=ax, style='.-')
对此: 直接在ax上使用matplotlib的plot方法。
ax.plot(data1.index, data1.values, '.-', label='Data 1')
ax.set_ylabel('Data 1')
此行相同(原始):
data2.plot(ax=ax, style='.-', secondary_y=True)
对此: twinx() 在同一图上创建辅助 y 轴,而不依赖 pandas。
ax2 = ax.twinx()
ax2.plot(data2.index, data2.values, '.-', color='orange', label='Data 2')
ax2.set_ylabel('Data 2')
可选:添加ight_layout(),因为我们添加了两个y轴标签。
这应该可以解决问题,上图使用这些数据点:
data2 = pd.Series(
[5.67, 5.85, 5.78],
index=pd.DatetimeIndex(["2024-09-15 07:03:39", "2024-09-15 07:08:43", "2024-09-15 07:13:47"])
)