如何在散点图的x轴上绘制每分钟的时间。

3

为1秒采样数据设置分钟小刻度会引发以下错误:OverflowError: int too big to convert

考虑到这个数据框的采样间隔为1秒,跨越了大约30分钟:

import matplotlib.pyplot as plt
from matplotlib.dates import MinuteLocator
import pandas as pd

ndex = pd.date_range('2021-08-01 07:07:07', '2021-08-01 07:41:12', freq='1S', name='Time') 
df = pd.DataFrame(data=np.random.randint(1, 100, len(ndex)), index=ndex, columns=['A'])

现在我们将它绘制出来:

fig, ax = plt.subplots()
df.plot(color='red', marker='x', lw=0, ms=0.2, ax=ax)

创建一个没有任何投诉的图表: time vs randint

现在我想在每分钟处有小刻度。

我尝试过这个:

ax.xaxis.set_minor_locator(MinuteLocator())

但是这会导致 OverflowError: int too big to convert

1个回答

5
  • pandas.DataFrame.plot使用matplotlib作为默认的绘图后端,但它将日期刻度编码为Unix时间戳,导致OverflowError: int too big to convert
    • 这里的默认值是kind='line',但OP使用marker='x',lw=0,ms=0.2来制作一个hacky散点图。
  • pandas.DataFrame.plot.scatter将正常工作。
  • 使用matplotlib.pyplot.scatter将按预期工作。
    • matplotlib:日期刻度标签
      • Matplotlib日期绘图通过将日期实例转换为自纪元以来的天数(默认为1970-01-01T00:00:00)来完成
  • seaborn.scatterplot也可以:
    • sns.scatterplot(x=df.index, y=df.A, color='red', marker='x', ax=ax)
  • python 3.8.11pandas 1.3.2matplotlib 3.4.3seaborn 0.11.2中进行了测试

matplotlib.pyplot.scatter

  • 额外的格式化会导致刻度标签中的月份('01')被删除,例如:'%m %H:%M'
import matplotlib.dates as mdates
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(25, 6))
ax.scatter(x=df.index, y=df.A, color='red', marker='x')

hourlocator = mdates.HourLocator(interval=1)  # adds some extra formatting, but not required
majorFmt = mdates.DateFormatter('%H:%M')  # adds some extra formatting, but not required

ax.xaxis.set_major_locator(mdates.MinuteLocator())

ax.xaxis.set_major_formatter(majorFmt)  # adds some extra formatting, but not required
_ = plt.xticks(rotation=90)

enter image description here

pandas.DataFrame.plot.scatter

  • 还有使用kind='scatter'pandas.DataFrame.plot
    • ax = df.reset_index().plot(kind='scatter', x='Time', y='A', color='red', marker='x', figsize=(25, 6), rot=90)
# reset the index so Time will be a column to assign to x
ax = df.reset_index().plot.scatter(x='Time', y='A', color='red', marker='x', figsize=(25, 6), rot=90)
ax.xaxis.set_major_locator(mdates.MinuteLocator())

enter image description here


  • 注意两种方法生成的xticks的差异

pandas.DataFrame.plot xticks

ax = df.plot(color='red', marker='x', lw=0, ms=0.2, figsize=(25, 6))

# extract the xticks to see the format
ticks = ax.get_xticks()
print(ticks)
[out]:
array([1627801627, 1627803672], dtype=int64)

# convert the column to unix format to compare
(df.index - pd.Timestamp("1970-01-01")) // pd.Timedelta('1s')

[out]:
Int64Index([1627801627, 1627801628, 1627801629, 1627801630, 1627801631,
            1627801632, 1627801633, 1627801634, 1627801635, 1627801636,
            ...
            1627803663, 1627803664, 1627803665, 1627803666, 1627803667,
            1627803668, 1627803669, 1627803670, 1627803671, 1627803672],
           dtype='int64', name='Time', length=2046)

matplotlib.pyplot.scatter xticks

fig, ax = plt.subplots(figsize=(25, 6))
ax.scatter(x=df.index, y=df.A, color='red', marker='x')

ticks2 = ax.get_xticks()
print(ticks2)

[out]:
array([18840.29861111, 18840.30208333, 18840.30555556, 18840.30902778,
       18840.3125    , 18840.31597222, 18840.31944444])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接