使用 Pandas/Matplotlib 在辅助 y 轴上绘制线条时出现异常内存错误

问题描述 投票:0回答:1

向辅助轴添加线条时出现以下内存错误:

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"
,则绘图不会出现问题:

enter image description here

请注意,两个数据集都有不均匀间隔的日期时间索引。

不确定这是否与此错误有关:

其他人可以重现此错误吗?

版本:

  • Python 3.10.12
  • 熊猫2.1.2
  • matplotlib 3.8.2
  • numpy 1.26.1
python pandas matplotlib plot
1个回答
0
投票

已知问题,问题可以在这里找到: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轴标签。

Image of correct plot with problematic values

这应该可以解决问题,上图使用这些数据点:

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"])
)
© www.soinside.com 2019 - 2024. All rights reserved.